我只是好奇这个代码是否会造成多个内存泄漏,或者它是否会被正确清理。
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node();
}
delete newNode;
很明显,代码没有做任何事情,但它确实帮助我解释了我的场景。我分配内存10次,当我删除指针留下9个孤儿?或者我是否重复使用相同的空间并正确删除孤儿? 提前谢谢!
答案 0 :(得分:6)
是的,这是在泄漏记忆。当你这样做时:
newNode = new Node();
您正在重新定义指针以指向新分配的内存,实际上会失去一种方法来解决以前指向的内存以便删除它。
因此,当您离开循环时,newNode
指针指向最后分配的(第十)内存/ Node
。当您delete newNode
时,您只删除该内存。你不再有办法delete
其他人。
正如 Zhi Wang 所指出的,您可以使用某种形式的智能指针(例如,在C ++ 11中使用unique_ptr
或shared_ptr
)。这些智能指针基本上是常规指针的包装器,它们具有防止这种泄漏的附加语义。如果你使用其中一个,当内存/对象超出范围时(在这种情况下结束for
循环的当前迭代时),将自动释放内存/对象。
然而,我不认为这会解决你在这种情况下的情况。我怀疑你一旦创建它们就想要delete
10个对象。相反,您可能希望将这些对象存储在像std::vector
这样的容器中,或者至少有一个指向这些已分配实例的指针数组。这样你就可以拥有周围的物体(我相信这是你想要的,因为你正在构建它们),并且还有一种方法可以在以后删除它们。
答案 1 :(得分:3)
是的,您的代码会泄漏内存。你对行为的第一次猜测是正确的。这段代码
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node(); // allocate memory 10 times in a loop...
}
delete newNode; // ... but free the memory only once!
分配内存10次(new
循环内的for
运算符),但释放仅由一个对象使用的内存({{1}操作员在底部)。当然,这会使其他9个孤立的对象 - 它们消耗的内存仍然被分配,但是你现在无法访问它来释放它。当然,这就是内存泄漏的定义。
相比之下,这段代码
delete
不泄漏任何内存,因为对Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node(); // allocate memory 10 times in a loop
delete newNode; // ... and free the memory each time
}
的每次调用只有一次delete
来电。这是您必须牢记的一个重要规则:如果您不能将每次调用new
与new
的相应调用相匹配,则会发生内存泄漏
或者,当你在C ++中工作时,或许更好的规则是从不首先使用原始指针。 C ++标准库提供了几个很棒的包装类,它们为指针实现RAII习惯用法,这可以确保指向的对象被正确销毁,从而释放它们消耗的内存。您可以在favorite C++ book或Wikipedia上开始研究。