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

C++, allocating space in a for loop, possible memory leak verification

本文关键字:泄漏 验证 内存 空间 for 循环 分配 C++      更新时间:2023-10-16

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

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_ptrshared_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++书或维基百科上开始你的研究。