2013-03-14 29 views
4

我只是好奇这个代码是否会创建多个内存泄漏,或者它是否会被正确清理。C++,for循环中分配空间,可能的内存泄漏验证

Node *newNode; 

for (int i = 0; i < 10; i++) 
{ 
    newNode = new Node(); 
} 

delete newNode; 

显然,代码并没有做任何事情,但它确实帮助我解释了我的情况。我是否分配了10次内存,当我删除指针时会留下9个孤儿?还是我重复使用分配的同一个空间并正确删除孤儿? 在此先感谢!

+0

您可以使用Valgrind运行您的程序以查看是否有内存泄漏。 – taocp 2013-03-14 03:38:54

+1

10项,1项删除,9项孤儿。 – enhzflep 2013-03-14 03:38:57

+0

你在做前者。只有最后的分配才能得到适当的清理。其他九个对象是孤儿。 – OldProgrammer 2013-03-14 03:39:30

回答

6

是的这是内存泄漏。当你这样做:

newNode = new Node(); 

您正在重新定义指针指向新分配的内存,实际上失去的途径,使解决,以删除先前指出,内存保持。

因此,当您离开循环时,newNode指针指向最后分配的(第十)个内存/ Node。当你delete newNode你只删除那个内存。 delete其他人不再有办法。

由于志王指出的那样,你可以使用(在C++ 11例如unique_ptrshared_ptr)某种形式的智能指针。这些智能指针基本上是围绕常规指针的包装,这些指针具有防止这种泄漏的附加语义。如果使用其中的一个,则内存/对象在超出范围时会自动解除分配(在此情况下,当前循环的for循环结束时)。

但是,我不认为这会解决您在这种情况下的情况。我怀疑你想在创建它们时立即使用delete这10个对象。相反,您可能希望将这些对象存储在容器中,如std::vector或者至少有一个指向这些分配实例的指针数组。这样你就可以得到周围的物体(我相信这是你想要的,因为你正在构建它们),并且有办法在以后去除它们。

+0

准确地说,@ user1535978不要这样做,使用智能指针来保存分配的内存。 – 2013-03-14 03:44:17

+0

非常感谢,我最终使用了一组指针,我可以在上次使用后立即将它们删除。我很感激帮助。 :) – Xav 2013-03-19 00:42:23

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次(该循环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++ bookWikipedia开始您的研究。

+0

我将来肯定不会使用原始指针,但它们超出了我的教授在这项任务中期望的范围。谢谢您的帮助。 :) – Xav 2013-03-19 00:40:46

+0

是否必须删除for循环中声明的变量?我认为那些会在结尾处自动删除。 – CodyBugstein 2013-11-19 15:55:10