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)
它看起来很好.我会改变一些事情(主观上):
*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_ptr和ptr_vector.
这将做你期望的.但是,clear()完全没有必要,因为vector当你离开当前范围之后将会被销毁(在这种情况下,这也恰好是函数的结束和程序的结束).如果你打算继续vector用它做更多的事情,那么clear()就会删除所有的指针vector.事实上,它正在vector被摧毁,所以没有必要打电话clear().
另外,我的讨厌者想说你应该++i在你的循环中使用而不是i++因为i++创建了一个临时的,编译器无法优化掉(因为你正在处理一个重载的运算符).此外,由于你只是vector在删除其中的所有内容之后才会销毁它,所以将所有元素设置为没有多大意义NULL.如果你要重新使用元素而不是清除或破坏元素vector,那么这将是一个好主意.但在这种情况下,它只是效率低下.
| 归档时间: |
|
| 查看次数: |
2799 次 |
| 最近记录: |