You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:39:07