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