我只是好奇这个代码是否会创建多个内存泄漏,或者它是否会被正确清理。C++,for循环中分配空间,可能的内存泄漏验证
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node();
}
delete newNode;
显然,代码并没有做任何事情,但它确实帮助我解释了我的情况。我是否分配了10次内存,当我删除指针时会留下9个孤儿?还是我重复使用分配的同一个空间并正确删除孤儿? 在此先感谢!
我只是好奇这个代码是否会创建多个内存泄漏,或者它是否会被正确清理。C++,for循环中分配空间,可能的内存泄漏验证
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node();
}
delete newNode;
显然,代码并没有做任何事情,但它确实帮助我解释了我的情况。我是否分配了10次内存,当我删除指针时会留下9个孤儿?还是我重复使用分配的同一个空间并正确删除孤儿? 在此先感谢!
是的这是内存泄漏。当你这样做:
newNode = new Node();
您正在重新定义指针指向新分配的内存,实际上失去的途径,使解决,以删除先前指出,内存保持。
因此,当您离开循环时,newNode
指针指向最后分配的(第十)个内存/ Node
。当你delete newNode
你只删除那个内存。 delete
其他人不再有办法。
由于志王指出的那样,你可以使用(在C++ 11例如unique_ptr
或shared_ptr
)某种形式的智能指针。这些智能指针基本上是围绕常规指针的包装,这些指针具有防止这种泄漏的附加语义。如果使用其中的一个,则内存/对象在超出范围时会自动解除分配(在此情况下,当前循环的for
循环结束时)。
但是,我不认为这会解决您在这种情况下的情况。我怀疑你想在创建它们时立即使用delete
这10个对象。相反,您可能希望将这些对象存储在容器中,如std::vector
或者至少有一个指向这些分配实例的指针数组。这样你就可以得到周围的物体(我相信这是你想要的,因为你正在构建它们),并且有办法在以后去除它们。
准确地说,@ user1535978不要这样做,使用智能指针来保存分配的内存。 – 2013-03-14 03:44:17
非常感谢,我最终使用了一组指针,我可以在上次使用后立即将它们删除。我很感激帮助。 :) – Xav 2013-03-19 00:42:23
是的,你的代码泄漏内存。你对这种行为的第一次猜测是正确的。此代码
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
}
不会泄露任何内存,因为有一个呼叫delete
每次调用new
。这是你必须记住的一个大规则:如果你不匹配每个呼叫到new
并相应调用delete
,你将有一个内存泄漏。
或者,当你在C++中工作时,更好的规则是从不首先使用原始指针。 C++标准库提供了几个很好的包装类,它们实现了指针的RAII成语,这确保指向的对象得到适当的销毁,并因此释放它们消耗的内存。从favorite C++ book或Wikipedia开始您的研究。
我将来肯定不会使用原始指针,但它们超出了我的教授在这项任务中期望的范围。谢谢您的帮助。 :) – Xav 2013-03-19 00:40:46
是否必须删除for循环中声明的变量?我认为那些会在结尾处自动删除。 – CodyBugstein 2013-11-19 15:55:10
您可以使用Valgrind运行您的程序以查看是否有内存泄漏。 – taocp 2013-03-14 03:38:54
10项,1项删除,9项孤儿。 – enhzflep 2013-03-14 03:38:57
你在做前者。只有最后的分配才能得到适当的清理。其他九个对象是孤儿。 – OldProgrammer 2013-03-14 03:39:30