C++原始指针和"delete"

C++ raw pointers and "delete"

本文关键字:delete 指针 原始 C++      更新时间:2023-10-16


我对下面的代码片段有一个问题:

double d = 20.1;
double* pd = new double;
...
pd = &d;
delete pd;

最后一行在 Visual C++ 2015 中引发错误。这是否意味着指针"pd"指向"d"的堆栈地址,并且它在堆中的原始指向地址(第二行等号的右侧(已经泄漏?

是的,您pd泄漏了双精度指针,但这不是导致错误的原因。

该错误是由于您尝试delete堆栈分配地址造成的。这是严格未定义的行为。delete仅适用于使用new创建的指针。

变量保存值。指针值就是值。不是名字。不是变量。

当你操作一个指针值时,例如把它传递给delete,你只关心这个值。

它本质上等同于:

int one=1;
one=2;
std::cout << one; // you won't be surprised to see 2, will you?

变量中的当前值很重要;而不是以前的某个值。不是名字。

您的程序尝试释放(delete(不是由您(用户(分配的对象,而是由编译器分配的对象。

是否意味着指针"pd"指向"d"的堆栈地址,并且它在堆中的原始指向地址(第二行等号的右侧(已经泄漏?

是的,这正是这个意思。