这可能是内存泄漏吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这可能是内存泄漏吗?相关的知识,希望对你有一定的参考价值。

使用new then设置为null会导致内存泄漏吗?

我已经尝试了以下代码,但不知道它是否会导致任何泄漏

#include <iostream>

using namespace std;

int main()
{

   int* x = new int;
   int y = 1;
   x = &y;

   x = nullptr; // has the memory allocated to x gone now?

   x =&y;       // did i recover what was lost?

   delete x;   

   return 0;
}

// cout << * x按预期给出1

答案

是的,这是泄漏。但是,当您将nullptr分配给x时,不会发生泄漏,而是在它之前的行中:

x = &y;

x现在指向y的地址,并且没有其他对你使用new int分配的内存的引用。没有任何对该内存的引用,就无法释放它。

另一答案

当您指定保存它的唯一指针时,指向对象将丢失。如上所述,x = &y已经失去你的new int。之后你没做什么可以把它带回来。这意味着delete会调用未定义的行为并可能导致程序崩溃。

但是,C ++中有一种机制可以避免这种内存泄漏:Smart Pointers。

在C ++中,智能指针有两个主要的变种::std::unique_ptr<T>::std::shared_ptr<T>。他们的工作是保持动态内存中的对象,并确保在它变为无主时删除它:

::std::unique_ptr<int> x = ::std::make_unique<int>(0);
x = nullptr; // automatically deletes the previously allocated int

这比原始指针略贵,但它不容易出现内存泄漏。智能指针位于<memory>标题中。

以上是关于这可能是内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

Navigation Arch 组件会造成误报内存泄漏吗?

如何防止java中的内存泄漏

这个 JavaScript 代码会导致内存泄漏吗?

为啥.NET 没有内存泄漏?

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

使用导致内存泄漏的音频片段