使用指针删除对象时触发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
相关产品推荐
相关产品推荐

