这可能是内存泄漏吗?
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>标题中。
以上是关于这可能是内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章