这可能是内存泄漏吗?

时间:2019-04-28 18:02:43

标签: c++ c++11

使用新的然后设置为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

2 个答案:

答案 0 :(得分:4)

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

x = &y;

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

答案 1 :(得分:1)

指向对象时,将其分配给保存它的唯一指针时,该对象将丢失。如上所述,x = &y已经失去了您的new int。您此后所做的任何事情都无法将其恢复。这意味着delete会调用未定义的行为,并可能导致程序崩溃。

但是,C ++中有一种避免此类内存泄漏的机制:智能指针。

在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>标头中。