当我试图通过函数删除一个新分配的变量时,为什么要打印相同的内存地址,我有点困惑,我猜没有内存泄漏或指针悬空。
打印了相同的内存地址。
#include <iostream>
using namespace std;
void deallocater(int *p)
{
delete p;
p = nullptr; // memory deleted and no dangling pointer right?
}
int main()
{
int *x = new int(1);
cout<<x;
deallocater(x);
cout<<endl<<x; // why is the same memory address being printed?
return 0;
}
我认为该功能已成功运行
答案 0 :(得分:7)
调用函数
void deallocater(int* p)
{
delete p;
p = nullptr;
}
通过
deallocater(x);
将x
的值复制到p
。因此,在deallocater()
中为局部变量p
分配了nullptr
。但是,调用程序的变量x
不变。
您可以通过引用引用来实现您想要的目标:
void deallocater(int* &p)
{
delete p;
p = nullptr;
}
但是,不应将内存分配和取消分配拆分为不同且不相关的功能,以避免出现指针悬垂和/或内存泄漏的危险。相反,好的C ++代码几乎不包含任何delete
语句和很少的new
语句(用于初始化智能指针),而是使用标准的库结构(容器和智能指针)进行内存管理。
答案 1 :(得分:2)
该代码无法更改p
中指针deallocater()
的内容,因此在打印时它仍显示相同的值。调用p
之后,仍然具有相同的(指针)值,但是指向的内存已释放。这就是所谓的“悬空参考”。
要更新指针,请使用双指针或对指针的引用:
void deallocater(int **p)
{
delete *p;
*p = nullptr; // memory deleted and no dangling pointer right?
}
int main()
{
int *x = new int(1);
cout<<x;
deallocater( &x );
cout<<endl<<x; // why is the same memory address being printed?
return 0;
}