这可能是内存泄漏吗?

问题描述 投票:0回答:2

使用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

c++ c++11
2个回答
3
投票

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

x = &y;

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


0
投票

当您指定保存它的唯一指针时,指向对象将丢失。如上所述,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>标题中。