关于C++中delete栈指针报错及原堆内存是否泄漏的问询
关于你的C++指针与内存管理问题解答
Hey there, let's break this down clearly for you:
为什么
delete pd会报错?
你猜的完全正确!最后一行执行时,pd已经被赋值为栈变量d的地址了。而delete的规则很明确:它只能用来释放通过new从堆上分配的内存。栈内存是由编译器自动管理的(比如函数执行完毕后栈帧会自动销毁),手动调用delete去释放栈内存属于未定义行为,Visual C++ 2015抛出错误就是在阻止你做这个危险操作。最初的堆内存是不是泄漏了?
没错!当你执行pd = &d;的时候,pd原本存储的、由new double分配的堆内存地址被直接覆盖了——现在没有任何指针指向那块堆内存了,你再也没办法通过delete去释放它,这就造成了经典的内存泄漏。
正确用法示例
如果你的需求是让指针指向栈变量,记得先释放之前的堆内存(如果不需要了):
double d = 20.1; double* pd = new double; // 先释放堆内存,避免泄漏 delete pd; pd = &d; // 这里绝对不能再delete pd!它现在指向栈内存
如果你的需求是把d的值存到堆内存里,不要修改指针指向,而是修改指针指向的内容:
double d = 20.1; double* pd = new double; *pd = d; // 将d的值赋值给堆上的变量 delete pd; // 正确释放堆内存,没有泄漏
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

