繁体   English   中英

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

[英]Add elements and clear a vector of pointers in C++

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

#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);
}

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

*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

这将做你期望的。 但是, clear()是完全没必要的,因为当你离开当前作用域之后, vector将被销毁(在这种情况下也恰好是函数的结尾和程序的结尾)。 如果你打算保持vector来做更多的事情,那么clear()将从vector删除所有指针。 事实上, vector正在被摧毁,因此调用clear()没有意义。

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

是的有效。

一些评论:

  • 而不是包括stdlib.h,c ++等价物是cstdlib。
  • 如果你真的不需要指针,你的向量可以是vector<Node> ; 如果你需要它们,最好使用智能指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM