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

使用指针删除对象时触发munmap_chunk(): invalid pointer错误的咨询

嘿,我来帮你搞清楚这个内存错误的问题!

错误原因

你遇到的munmap_chunk(): invalid pointer错误,核心问题出在内存管理的规则搞错了:

  • 你代码里的test a;是在栈内存上创建的对象。栈内存的生命周期完全由编译器自动控制——当对象所在的作用域(比如这里的main函数)结束时,编译器会自动调用它的析构函数,并且回收栈内存,根本轮不到我们手动释放。
  • 而delete运算符有且只有一个合法用途:释放通过new关键字在堆内存上分配的对象/内存块。你现在用delete去操作一个指向栈内存的指针,相当于告诉内存管理器去释放它管不着的区域,系统自然会抛出非法指针的错误。
解决方法

根据你的实际需求,有两种正确的处理方式:

方式一:继续使用栈对象(推荐,更安全)

既然栈对象的内存是自动管理的,直接删掉delete pa;这一行就可以了。修改后的代码如下:

#include <iostream>
using namespace std;
class test{
    int x;
public:
    void izpis(){
        cout << x;
    }
    test(){
        x = 1;
    }
    ~test(){
        cout << "brisem";
    }
};
int main() {
    test a;
    test *pa = &a;
    pa->izpis();
    // 移除delete pa;,栈对象的内存会自动释放
}

运行后会先输出1,等main函数执行完毕时,编译器自动调用a的析构函数,输出brisem,全程不会有任何错误。

方式二:改用堆对象(需要手动管理内存)

如果你确实需要手动控制对象的生命周期(比如对象需要存活到作用域之外),那就要先用new在堆上创建对象,之后再用delete合法释放。修改后的代码:

#include <iostream>
using namespace std;
class test{
    int x;
public:
    void izpis(){
        cout << x;
    }
    test(){
        x = 1;
    }
    ~test(){
        cout << "brisem";
    }
};
int main() {
    test *pa = new test; // 用new在堆上分配内存创建对象
    pa->izpis();
    delete pa; // 此时delete是合法的,正确释放堆内存
}

运行后同样会先输出1,然后调用析构函数输出brisem,不会触发内存错误。

内容的提问来源于stack exchange,提问作者Tim Hajdinjak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:57:28