关于C++删除和内存泄漏的澄清

据我了解,C++ 编译器会自动尝试删除超出范围的对象。然而,在这个记录悬空指针情况的SO 帖子中,有一个char数组被自动清除但没有delete操作:

char *func()
{
   char str[10];
   strcpy(str, "Hello!");
   return str; 
}

这显然会返回一个悬空指针,因为内存将在作用域之后被释放。但是,如果我没有指定,这怎么可能delete?就我而言,这个网站显示了我认为在类似情况下会发生的情况:

#include <iostream>
using namespace std;
void oil_leak() {
  //allocate 8 bytes from heap
  double *pointer = new double(32.54);
}
int main() {
  oil_leak();
}

即,为指针分配的内存在作用域之后没有释放,导致内存泄漏。

回答

To my understanding, the C++ compiler automatically tries to delete objects that go out of scope.那是不正确的,您将删除与破坏混淆了。销毁是自动的,删除不是。

在你引用的情况下,数组str被破坏,因此有一个悬空指针。删除在这段代码中没有任何作用,因为没有分配。分配发生在您使用时new,并且分配的内存需要删除。

你的“类似情况”实际上是完全不同的。事实上,这是差异的一个很好的例证。指针pointer被销毁(与所有块范围变量一样),但这并不意味着它指向的内存将被删除。只有调用 才能delete做到这一点。


以上是关于C++删除和内存泄漏的澄清的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>