2010-07-26 58 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>;如果你需要它们,最好使用智能指针。