2016-09-22 6 views
-1

containerオブジェクトとitemオブジェクトがあります。 Itemcontainerの一部です。 itemメンバ関数は、itemを削除するcontainer関数を呼び出します。メンバー関数からのオブジェクトの削除

itemオブジェクトを削除した機能が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がfalseで、ContainerからcheckFailedは(targetItemCheck()関数が呼び出されるところからitemである)と呼ばれている場合は何が起こりますか。

+4

状況によっては、コードを使用できますか?これにより、これははるかに明確になります。 – NathanOliver

+2

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

答えて

1

動作は明確に定義されています(または定義されていません)。

具体的には、オブジェクトがオペレータnewで作成され、deletedの後で使用されていない場合、その動作は明確に定義されています(たとえば、現在参照されていないポインタが逆参照され、 、非静的メンバー関数などと呼ばれる)。

オブジェクトが削除されて使用される場合、その動作は未定義です。

1

Container::checkFailed()Item::check()に戻ると、この*(Itemインスタンスの任意の/すべてのメンバー)がなくなり、未定義の動作をすることなく使用することはできません。

関連する問題