2013-07-27 4 views
0

좀 이상한 문제가 있습니다. 나는 클래스 연산자의 내부에서 delete 연산자를 사용하고 어떻게이 문제를 해결하는지 알고 싶다.클래스 내부에서 삭제

이 코드 : 데이터가 삭제 운영자에 의해 삭제 된 경우

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
     int a; 

     ~A() { 
      cout << "call ~A()" << endl; 
     } 

     void action() 
     { 
      /* code here */ 
      delete this; //this line depends on some if statements 
      /* code here */ 
     } 

     void test2() { 
      cout << "call test2()" << a << endl; 
     } 

     void test() { 
      a = 10; 
      cout << "call test()" << endl; 

      action(); 

      //how can I check if data is deleted? 
      test2(); 
     } 
}; 

int main() 
{ 

    A* a = new A(); 
    a->test(); 

} 

는 어떻게 확인할 수 있나요? 심지어 가능합니까?

+2

당신은 비 정적 멤버 함수 내에서 클래스의 인스턴스를 삭제합니다. 나는 너 자신에게 "나는 무엇을 성취하려고 하는가?"라고 자문 할 필요가 있다고 생각한다. 예를 들어 – lapk

+0

내가이 윈도우의 자식 버튼 액션 closeWindow을() 나는 나는 당신이 필요 디스패처 – UnknownError1337

+0

의 가장 빠른 방법 또는 사용 였을 것입니다 생각, 창을 삭제해야하지만, 방법을 정확하게 모르는 호출 할 때, GUI를 가지고 실제 창을 파괴하지만 누가이 창을 나타내는 C++ 클래스의 인스턴스를 삭제해야한다고 말했습니까? Windows 메시지 처리를 수행하는 경우 여기 [일부 정보] (http://stackoverflow.com/questions/8273830/win32-more-object-oriented-window-message-handling-system/8274312#8274312)가 있습니다. Remy Lebeau는 Borland VCL에서 어떻게 수행되는지에 대한 흥미로운 통찰력을 제공합니다. – lapk

답변

4
  1. delete this;은 거의 항상 "불량"입니다. 예외가 있지만 정말 특이합니다. 당신이하려는 일에 대해 생각해보십시오. 대부분의 경우 이는 래퍼 객체와 래퍼 객체에 의해 생성/삭제 된 내부 객체를 가져야 함을 의미합니다.

  2. 뭔가 (신뢰할 수있는 방법/휴대용 방법으로) 삭제 된 경우 당신은 확인할 수 없습니다. 특정 테스트 케이스에서는 "파괴 된 객체를 사용"하여 "정의되지 않은 동작"을 수행합니다. 즉, 실제로 일어날 일을 말할 수 없습니다. delete은 레이블에 표시된대로 C++ 런타임을 신뢰해야합니다.

+1

그것은 종종 당신이 필요로하는 모든이 바로 "단서"비 정적 데이터가 충분 접근 피할 수 있지만, 엄격 당신은 아마 아직도 UB를 호출하고 말하기, 실질적 문제 ... – UnknownError1337

+1

오전, 너무 간단합니다 . 그냥 하지마. –

2

void 이외의 다른 반환 값이 있습니다. 따라서 actionthis이 삭제되었는지 여부를 나타내는 내용을 반환 할 수 있습니다. 어떤 비 정적 데이터 멤버에 액세스하거나 this 삭제 중 후 비 정적 멤버 함수를 호출한다

참고. 어떤 사람들은 보증하기가 어렵다고 느껴서 delete this을 모두 금지합니다.

C++ FAQdelete this이 합법적이라고 주장하며 이에 대해 아무 것도 발견하지 못했습니다.

+0

를 해결하는 것이 얼마나 어리석은 내가 –

+1

표준에서 해당 케이스에 대한 UB를 찾을 수 없습니다. 어디 보여 줄 수 있니? 나는 그런 자기 소유의 물건의 큰 팬이 아니다. 때로는 합리적 일 수 있습니다. 그런 다음 이것을 삭제하면 인위적인 소유자와 같은 상황에서 끝나는'owner-> deleteMe (this)'bloat을 피할 수 있습니다 : nonstatic에 접근 할 수 있습니다. –

+0

나는 이해한다. P – UnknownError1337

관련 문제