2016-09-22 54 views
-1

我們有一個container對象和一個item對象。 Itemcontainer的一部分。成員函數item調用container函數刪除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是假的,checkFailedContainer被稱爲(targetItem是從哪裏Check()函數被調用的item)會發生什麼。

+4

你能用一些代碼來舉例說明你的情況嗎?這將使這更清楚。 – NathanOliver

+2

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

回答

1

該行爲已定義良好(或未定義)。

更具體而言,行爲是良好定義的,如果對象與操作者new創建的,並且是delete d(例如,[現在叼着]指向它的指針被廢棄時,非靜態構件被訪問後,不使用,稱爲的非靜態成員函數等)。

如果刪除後使用該對象,則行爲未定義。

1

是的,這是一個更復雜的情況下刪除這個,一旦Container::checkFailed()返回到Item::check()這個*(和任何/所有成員的項目實例)消失了,不能使用沒有未定義的行爲。