我只是好奇这段代码是否会造成多个内存泄漏,或者它是否会被正确清理。
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node();
}
delete newNode;
很明显,代码没有任何作用,但它确实帮助我解释了我的场景。我是否分配了10次内存,当我删除留下9个孤儿的指针时?或者我是在重复使用正在分配的相同空间,并正确地删除孤立空间?提前感谢!
newNode = new Node();
您正在重新定义指向新分配内存的指针,实际上失去了对以前指向的内存进行寻址以删除它的方法。
因此,当您离开循环时,newNode
指针指向最后分配的(第十个(内存/Node
。当您delete newNode
时,您只删除该内存。你再也没有办法delete
其他人了。
正如Zhi Wang所指出的,您可以使用某种形式的智能指针(例如C++11中的unique_ptr
或shared_ptr
(。这些智能指针基本上是常规指针的包装器,常规指针具有防止此类泄漏的附加语义。如果使用其中一个,那么当内存/对象超出范围时(在这种情况下,在for
循环的当前迭代结束时(,它们将自动解除分配。
但是,我认为这不能解决您在这种情况下的情况。我怀疑您是否希望在创建10个对象时立即delete
。相反,您可能希望将这些对象存储在像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次(for
循环中的new
运算符(,但释放这些对象中只有一个使用的内存(底部的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
}
不会泄漏任何内存,因为对new
的每个调用都有一个对delete
的调用。这是您必须记住的一条重要规则:如果您不将对new
的每次调用与对delete
的相应调用相匹配,则会出现内存泄漏。
或者,当你在C++中工作时,也许更好的规则是从一开始就不要使用原始指针。C++标准库提供了两个很好的包装类,它们实现了指针的RAII习惯用法,这确保了所指向的对象被正确地销毁,从而释放了它们消耗的内存。在你最喜欢的C++书或维基百科上开始你的研究。