我读过cpprefrence:
删除释放先前由匹配运算符分配的存储空间 新。
但是在这里,我只得到3.4作为输出而不是2.1。
#include <iostream>
int main(){
float x, y; x = y = 0;
float * p = &x;
*p = 3.4;
std::cout << *p;
delete p; //Can I deallocate memory of a static pointer?
p = &y;
*p = 2.1;
std::cout << *p;
delete p;
return 0;
}
更新:我已在此处添加了运算符new
,但代码仍未提供预期结果。
int main(){
float *p = new float(3.4);
float x, y; x = y = 0;
p = &x;
*p = 3.4;
cout << *p;
delete p; //Deallocate the memory of p pointer.
p = &y; //Shouldn't this line reallocate the memory to p? or maybe &p = &y;
*p = 2.1;
cout << *p;
delete p;
return 0;
}
我们的老师告诉我们找到一个解决方法,以便在删除poitner后仍能设置指针所指向的值
int main(){
float *p = new float(3.4);
delete p; // We want to delete the pointer but change the value of *p afterwards.
*p = 2.1;
std::cout << *p;
}
答案 0 :(得分:3)
从你的帖子:
删除先前由匹配运算符new分配的释放存储空间。
使用时:
float x, y; x = y = 0;
float * p = &x;
delete p;
你没有遵循这个陈述。
p
未指向由operator new
分配的对象。它指向堆栈上的局部变量。
使用更新的代码,您确实通过调用new
来分配内存,但是您更改了p
,以便它指向堆栈上的变量。
float *p = new float(3.4); // p points to object returned by new
float x, y; x = y = 0;
p = &x; // p points to x. The previous memory is leaked
因此,
delete p;
时,您的程序仍然会受到未定义的行为。修复以下代码的解决方案是什么。
解决方案1 请勿在行p
之后使用delete p;
,因为它不是有效指针,因为它不是。
解决方案2 分配新内存,将其分配给p
,然后再使用p
。
int main(){
float *p = new float(3.4);
delete p; // I need to delete p right at this part of code.
p = new float; // Allocate new memory
*p = 2.1;
std::cout << *p;
delete p; // Deallocate the memory before program ends
}
答案 1 :(得分:0)
您正在尝试删除自动分配的变量(通常在堆栈中)。运算符 delete 仅适用于动态分配的变量(通常在堆中)。有堆栈内存管理的库,但是每次它们超出范围时,让编译器自行解除所有自动分配的变量是一个很好的做法。