2010-07-26 57 views
3

我想將2個元素添加到vector<Node*>中,然後清除所有元素並釋放內存。
這段代碼是否以正確的方式做到這一點?添加元素並清除C++中的指針矢量

#include <stdlib.h> 
#include <iostream> 
#include <vector> 

using namespace std; 

class Node { 
public: 
    int value; 
    // ...and some other fields and methods... 
}; 

int main(int argc, char** argv) { 
    Node* n = new Node; 
    n->value = 20; 
    vector<Node*> v; 
    v.push_back(n); 
    n = new Node; 
    n->value = 52; 
    v.push_back(n); 
    for (vector<Node*>::iterator i = v.begin(); i != v.end(); i++) { 
     cout << (*i)->value << endl; 
     delete *i; 
     *i = NULL; 
    } 
    v.clear(); 
    return (EXIT_SUCCESS); 
} 

回答

8

這對我來說很好。有幾件事情,我會改變(主觀):

*i = NULL; // This is unnecessary. 

然後我會避免重複使用n(實際上,我會避免它完全):

v.push_back(new Node); 
v.back()->value = 20; 
v.push_back(new Node); 
v.back()->value = 52; 

此外,您可能想要考慮智能指針來爲你追蹤你的記憶。見shared_ptrptr_vector

+0

爲什麼在數據似乎沒有任何「多個所有者」的情況下使用智能指針? – Simon 2010-07-26 20:13:17

+0

@Simon:智能指針(通常)不僅在有多個所有權時有用 - 所以我假設你指的是使用'shared_ptr'?您不能將'auto_ptr'放入標準容器中,但可以將'shared_ptr'放入容器中(http://www.gotw.ca/publications/using_auto_ptr_effectively.htm)。有些人不惜一切代價避免生ptrs,我並不是建議 - 只要知道有一些解決方案可以讓你避免內存清理;並且@Jani應該自行決定何時使用它。 – Stephen 2010-07-26 20:45:23

+0

如果您擁有明確的所有權,則shared_ptr會提供成本高昂的內存清除(循環),同時如果您尚未使用boost,也會增加鏈接時間。在你有一個對象是其他對象的所有者的情況下,範圍指針不應該是一個更好的建議嗎? – Simon 2010-07-27 05:14:11

5

這將做你所期望的。但是,clear()是完全沒有必要的,因爲vector會在當前離開當前作用域(在這種情況下也是該函數的結束和程序的結束)之後被銷燬。如果您打算保留vector以做更多事情,那麼clear()會從vector中刪除所有指針。事實上,vector正在被銷燬,因此撥打clear()毫無意義。

而且,我都捨不得虧的希望說,你應該在你的循環,而不是i++使用++i因爲i++創建一個臨時的編譯器不能優化掉(因爲你在處理重載運算符)。此外,由於您只是在刪除了所有內容後立即銷燬vector,因此將其全部元素設置爲NULL沒有多大意義。如果您要重複使用元素而不是清除或銷燬vector,那麼這將是一個好主意。但在這種情況下,這只是效率低下。

3

是的,它的工作原理。

一些言論:

  • 而是包括stdlib.h中的,C++的相當於是cstdlib。
  • 如果你真的不需要指針,你的向量可能是vector<Node>;如果你需要它們,最好使用智能指針。