使用新的然后设置为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
答案 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>标头中。