我只是好奇,如果这个代码会创建多个内存泄漏,或者是否会得到正确清理。
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node();
}
delete newNode;
所以很明显的代码没有做任何事情,但它确实帮我解释一下我的情况。 我是不是分配内存10倍,当我删除指针留下9名孤儿? 还是我重复使用相同的空间被分配给正确删除孤儿? 提前致谢!
我只是好奇,如果这个代码会创建多个内存泄漏,或者是否会得到正确清理。
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node();
}
delete newNode;
所以很明显的代码没有做任何事情,但它确实帮我解释一下我的情况。 我是不是分配内存10倍,当我删除指针留下9名孤儿? 还是我重复使用相同的空间被分配给正确删除孤儿? 提前致谢!
是啊,这是泄漏内存。 当你这样做:
newNode = new Node();
您正在重新定义指针指向新分配的内存,实际上失去的途径,使解决,以删除先前指出,内存保持。
所以,当你离开的循环中, newNode
指针指向最后一个分配(第十届)内存/ Node
。 当你delete newNode
只删除该内存。 您不再有办法通过其中delete
了别人。
正如志王指出的那样,你可以使用某种形式的智能指针( unique_ptr
或shared_ptr
用C例如++ 11)。 这些智能指针基本上都是围绕着具有防止这种泄漏的额外的语义规则指针包装。 如果您使用的其中之一,内存/对象将被自动当他们出去的范围(在的当前迭代的结束释放for
在这种情况下,循环)。
不过 ,我不认为这将解决你的情况在这种情况下。 我怀疑你想delete
只要你创建它们的10个对象。 相反,你可能要存储在像一个容器这些对象std::vector
或至少是有指向这些分配情况的指针数组。 这样,你将有周围的对象(我相信这是你想要的,因为你在所有的构造它们),也有办法通过,后来将其删除。
是的,你的代码泄漏内存。 您在行为第一猜测是正确的。 此代码
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
环),但释放由只这些对象中的一个 (所使用的存储器delete
在底部操作者)。 当然,这留下其他9点孤立的对象,他们的内存消耗仍被分配,但你现在有没有访问它释放它的方式。 也就是说,当然,内存泄漏的确切定义。
相比之下,这段代码
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
具有相应的调用来delete
,你将有一个内存泄漏 。
或者,也许当你在C ++中正在使用的更好的规则就是,永远在第一时间使用原始指针。 C ++标准库提供一对夫妇实施指针RAII成语,这确保了对象指向得到适当的破坏,因此,他们消耗的内存被释放的时候大包装类的。 开始你的研究无论是在你最喜欢的C ++的书 ,或在维基百科 。