2013-03-04 82 views
1

我有以下的載體:使用delete運算符的指針矢量

std::vector<xml::Node *> *children; 

在我的析構函數中我需要顯式調用delete上的元素在孩子Node *元素指向。所以,我做到以下幾點:

std::cout << "xml::Element destructor" << std::endl; 
if(children != NULL) { 
    if(n_children() > 0) { 
     for (int i = 0; i < n_children(); i++) { 
      delete children[i]; 
     } 
    } 
    delete children; 
} 

,但我得到了以下錯誤:

oops.cpp: In destructor ‘virtual xml::Element::~Element()’: 
oops.cpp:277:42: error: type ‘class std::vector<xml::Node*>’ argument given to ‘delete’, expected pointer 

我如何糾正呢?

回答

3
delete children[i]; 

應該是

delete (*children)[i]; 

因爲children是一個指針。

那麼,這是你的代碼在語法層面上的問題,雖然我覺得即使在修正上面的語法後,在設計層面仍然會有問題。爲什麼你宣稱children作爲指針?爲什麼不只是這一點:

std::vector<xml::Node*> children; //non-pointer now 

你有任何固體原因,爲什麼你不選擇呢?

在大多數情況下聲明一個容器作爲指針在內存管理方面違背了它的目的。你使用容器是因爲你不想自己處理內存管理。相反,你希望容器本身承擔這一負擔。容器超出範圍時會自動釋放所有資源。但是如果你聲明一個容器作爲指針,那麼你就要承擔刪除容器的重任。如果你錯過這樣做,那麼容器將永遠不會釋放它已經獲得的資源,並且會有內存泄漏。