在C++中添加元素并清除指针向量

use*_*ser 3 c++ memory-leaks vector

我想在a中添加2个元素vector<Node*>,然后清除所有元素并释放内存.
这段代码是否以正确的方式执行此操作?

#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);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*hen 8

它看起来很好.我会改变一些事情(主观上):

*i = NULL;  // This is unnecessary.
Run Code Online (Sandbox Code Playgroud)

然后我会避免重复使用n(实际上,我会完全避免它):

v.push_back(new Node);
v.back()->value = 20;
v.push_back(new Node);
v.back()->value = 52;
Run Code Online (Sandbox Code Playgroud)

此外,您可能需要考虑智能指针来跟踪您的记忆.请参阅shared_ptrptr_vector.


Jon*_*vis 5

这将做你期望的.但是,clear()完全没有必要,因为vector当你离开当前范围之后将会被销毁(在这种情况下,这也恰好是函数的结束和程序的结束).如果你打算继续vector用它做更多的事情,那么clear()就会删除所有的指针vector.事实上,它正在vector被摧毁,所以没有必要打电话clear().

另外,我的讨厌者想说你应该++i在你的循环中使用而不是i++因为i++创建了一个临时的,编译器无法优化掉(因为你正在处理一个重载的运算符).此外,由于你只是vector在删除其中的所有内容之后才会销毁它,所以将所有元素设置为没有多大意义NULL.如果你要重新使用元素而不是清除或破坏元素vector,那么这将是一个好主意.但在这种情况下,它只是效率低下.