C ++,在for循环中分配空间,可能的内存泄漏验证

时间:2013-03-14 03:36:44

标签: c++ pointers memory orphan

我只是好奇这个代码是否会造成多个内存泄漏,或者它是否会被正确清理。

Node *newNode;

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

delete newNode;

很明显,代码没有做任何事情,但它确实帮助我解释了我的场景。我分配内存10次,当我删除指针留下9个孤儿?或者我是否重复使用相同的空间并正确删除孤儿? 提前谢谢!

2 个答案:

答案 0 :(得分:6)

是的,这是在泄漏记忆。当你这样做时:

newNode = new Node();

您正在重新定义指针以指向新分配的内存,实际上会失去一种方法来解决以前指向的内存以便删除它。

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

正如 Zhi Wang 所指出的,您可以使用某种形式的智能指针(例如,在C ++ 11中使用unique_ptrshared_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来电。这是您必须牢记的一个重要规则:如果您不能将每次调用newnew的相应调用相匹配,则会发生内存泄漏

或者,当你在C ++中工作时,或许更好的规则是从不首先使用原始指针。 C ++标准库提供了几个很棒的包装类,它们为指针实现RAII习惯用法,这可以确保指向的对象被正确销毁,从而释放它们消耗的内存。您可以在favorite C++ bookWikipedia上开始研究。