2012-03-04 127 views
0

請幫忙弄清楚這一點。 我有一些泄漏的代碼,我不知道如何處理它泄漏當試圖釋放向量元素

vector <ItemClass> items(10); 
items[1] = ItemClass("DVD Player", 560); 
items[5] = * new ItemClass("Blu Ray Player", 900); 

我應該如何爲項目可用內存[5] 我讓我的釋放內存

delete &items[5]; 

delete [] &items[5]; 

的嘗試錯誤我甚至想是這樣

ItemClass * delItem = &items[5]; 
items[5] = item4; 
delete delItem; 

我在VS2010終極

回答

1

有一種奇怪的用法,在你的代碼中向量中存儲新分配的對象。通常你應該以同樣的方式處理列表。因此,下面的示例將更加明確,並且彼此獨立,這應該有助於您理解差異。

僅將對象用於delete。見下面的代碼。

僅針對「本機」數組使用delete [],不適用於向量或類似的容器類或其中的對象。

雖然我不會給出數組的示例,因爲數組可能會更混亂。

默認例如堆棧:

vector <ItemClass> items(10); 

// does not need to be deleted because item is on the stack 
ItemClass item("device1", "10"); 
items.push_back(item); 

默認例如用堆分配:

vector <ItemClass*> items(10); 

ItemClass* pItem = new ItemClass("device2", "20"); 
items.push_back(pItem); 

// delete all items inside vector 
for (int i = 0; i < items.size(); i++) 
{ 
    ItemClass* pToDelete = items[i]; 
    delete pToDelete; 
    items.erase(i); 
} 

以下實施例應避免與僅用於澄清的事情了!風險自負。

存儲堆棧變量地址:

vector <ItemClass*> items(10); 

// does not need to be deleted because item is on the stack 
ItemClass item("device3", "30"); 
items.push_back(&item); // storing a reference to item 

// No need to delete this item that points to something on the stack. 
// However you might not be able to tell items apart which have been 
// created on the heap or the stack, so just dont do it. 

如果混合了之前和存儲引用和指針,必須自己處理的例子。我的建議:不要這樣做。

存儲復引用的項目:

vector <ItemClass> items(10); 

ItemClass* pItem = new ItemClass("device4", "40"); 
items.push_back(*pItem); 

// must be deleted because allocated on the heap 
// Again you can not tell which item is allocated on stack or heap. Avoid this. 
+0

謝謝澄清! – Yesman 2012-03-04 08:17:09

1

你不要讓「堆的腐敗」對不屬於您的物體撥打delete。您不擁有items[5]items矢量擁有它。

你需要delete什麼是ItemClass對象,您正在泄漏,這是你通過new ItemClass(...)創建,然後複製到items[5]之一。

ItemClass *temp = new ItemClass("Blue Ray Player", 900); 
items[5] = *temp; 
delete temp; 

如果你想從載體中刪除items[5],請載體將其刪除:

items.erase(items.begin() + 5); 

注意,這可能是相當低效的,因爲在矢量後來所有的項目都被移動向下一個位置,這需要爲每個移動的項目調用ItemClass賦值運算符一次。

您可能希望使用指向ItemClass的指針向量,或者使用指向矢量shared_ptrboost::ptr_vector

+0

謝謝你搶,我忘了對象所有權 – Yesman 2012-03-04 07:49:43

+0

我說得對不對?使用「New ItemClass(」藍光播放器「,900)創建的對象」被分配然後複製(通過使用拷貝構造函數)到項目[5]並且finaly指向第一個對象的指針丟失了? – Yesman 2012-03-04 08:45:26

+1

從技術上講,它是使用賦值運算符複製的,而不是複製構造函數。您的評論的其餘部分是正確的。 – 2012-03-04 08:50:39