2016-09-22 3 views
-1

container 개체와 item 개체가 있습니다. Itemcontainer의 일부입니다. item 멤버 함수는 item을 삭제하는 container 함수를 호출합니다.구성원 함수에서 개체 삭제

containeritem 개체가 item 구성원 기능을 삭제 한 기능을 수행하면 어떻게됩니까? 그것은 정의되지 않은 행동으로 이어지는 것처럼 들립니다. 이것은 delete this;의 좀 더 정교한 사례입니까?

편집 :

class Item 
{ 
    Container* itemContainer; 
    std::string itemName; 

    void check(void) 
    { 
     bool condition = false; 

     // check some condition (not relevant to the question) 

     if (!condition) 
     { 
      itemContainer->CheckFailed(itemName); 
     } 
    } 
} 

class Container 
{ 
    std::vector<Item*> itemList; 
    void checkFailed(std::string) 
    { 
     Item* targetItem; 

     //find item by name 

     delete targetItem; 
    } 
} 

그래서 제 질문했다 : condition이 거짓과 Container에서 checkFailed이 (targetItemCheck() 함수가 호출되는 곳에서 item이다)라고하면 어떻게되는지.

+4

몇 가지 코드로 상황을 예시 할 수 있습니까? 이 사실이 훨씬 더 명확 해집니다. – NathanOliver

+2

https://isocpp.org/wiki/faq/freestore-mgmt#delete-this –

답변

1

이 동작은 잘 정의되어 있습니다 (또는 정의되지 않았 음).

보다 구체적으로,이 개체는 연산자 new으로 생성되고 deleted 이후에 사용되지 않으면 잘 정의됩니다 (예 : [now dangling] 포인터가 참조 해제되고 비 정적 구성원이 액세스 됨 , 비 정적 멤버 함수라고 불리는 등).

개체가 삭제 된 후에 사용되면 동작은 정의되지 않습니다.

1

Container::checkFailed()Item::check()으로 돌아 오면이 * (및 Item 인스턴스의 모든/모든 멤버)가 없어지고 정의되지 않은 동작없이 사용할 수 없습니다.