2015-01-02 13 views
4

의 내가이삭제 후 반환 값입니다.

class A { 
public: 
    A(){}; 
    ~A(){}; 
    bool foo(int); 
}; 

bool A::foo(int i){ 

    if(i==10){ 
     delete this; 
     return true; 
    } 
    return false; 
} 

int main(){ 

    A *pnt = new A(); 
    if(pnt->foo(10)){ 
     cout<<"deleted with foo"<<endl; 
    } 
    else{ 
     delete pnt; 
    } 
    return 1; 
} 

이 괜찮거나 foo는 사실 돌려 보낼 정의되지 않은 동작하는 클래스를 가지고 가정 해 봅시다?

"delete this;"다음에 멤버 함수가 어떻게되는지 묻습니다.

+2

http://stackoverflow.com/questions/3150942/c-delete-this – inetknght

+0

Reopened : "중복"은 'void'함수에서'delete this;'에 관한 것입니다. 이 질문은'delete this;'가 괜찮습니까? 'return true;가'delete this;'를 수행 한 후에 OK인지 여부입니다. –

+0

C++ FAQ 항목에서 알 수 있듯이 표준 참조를 볼 수 있습니다. –

답변

1

나는 현재 표준을 위해 draft을 검색했으며, 댓글과 FAQ에서 언급 된 question도 읽었습니다.

이 코드가 정의되지 않은 동작으로 이어져야한다는 내용의 요소를 찾을 수 없습니다.

표준 메시지 : 미세 this은 :

  • 는 삭제의 오퍼랜드의 값이 널 포인터 값이 이전 신규 발현에 의해 생성 된 비 배열 객체에 대한 포인터 일 수있다 위 코드에서 올바르게 수정하십시오.
  • delete-expression의 피연산자 값이 널 포인터 값이 아닌 경우 delete 표현식은에 대해 의 소멸자를 호출합니다 (소멸자는 아무 작업도 수행하지 않습니다). ..
  • delete-expression의 피연산자 값이 널 포인터 값이 아닌 경우 삭제할 객체에 대한 new-expression에 대한 할당 호출이 생략되지 않고 할당이 확장되지 않은 경우 객체의 할당 된 부분에있는하지에서의 부호로서, 미세 물체가 해제 될

delete this 후 같은 코드는 상수를 사용하여 (5.3.4), 삭제 표현은을 해제 함수를 호출한다 값 true이면 코드가 UB로 이어질 이유가 없습니다. FAQ (및 ed 질문에 대한 답변)은 delete this이 유효하고 관용적 인 C++임을 명확히 나타냅니다.

따라서 return true을 실행해서는 안됩니다.

프로그래머는 delete this의 다른 사용법에 관해서는 프로그래머가 새로운 것으로 할당 된 객체에서만이 객체를 사용하도록 보장해야합니다. 그렇지 않다면 실제로 UB이기 때문입니다.

1

'이것을 삭제하십시오'라는 것을 이해하면이 포인터가 가리키는 객체가 유효하지 않게됩니다.

마찬가지로 멤버 변수를 사용하는 것은 정의되어 있지 않습니다. (vtable이 없기 때문에) 가상 (다형성) 함수를 호출 할 수 없습니다. 그러나 당신은 (당신의 경우 에서처럼) 가치를 반환하는 것을 포함 할 필요가있는 다른 것을 할 수 있습니다.