C++中delete关键字触发Unknown Signal错误排查求助
动态数组pop方法的内存错误分析与修复
你的问题出在内存管理API混用和pop逻辑错误两个关键点:
C/C++内存管理函数不能混用:你用C的
malloc/realloc分配内存,却用C++的delete释放单个元素。这两类API的内存管理机制完全不同,malloc分配的内存必须用free释放,new分配的才用delete,混用会直接触发内存错误。单个元素不能单独释放连续堆内存:
ptr指向的是一块连续的堆内存块,由realloc整体分配/扩容,你不能用delete单独释放其中某一个元素的内存——这种操作属于非法内存访问,必然导致程序崩溃。
修复后的pop方法代码
把pop里的delete替换成realloc来缩小整个数组的内存块:
T pop() { T temp = get(--size); // 重新分配缩小后的内存块,size已经减1 ptr = (T*) realloc(ptr, size * sizeof(T)); return temp; }
额外提醒
如果是C++开发,更推荐使用new/delete系列操作(而非malloc/realloc),尤其是当数组存储自定义类型时:
malloc只会分配原始内存,不会调用对象的构造函数free只会释放内存,不会调用对象的析构函数
这会导致自定义类型的对象无法正确初始化或销毁,引发更隐蔽的问题。
内容的提问来源于stack exchange,提问作者anom907 zat
相关产品推荐
相关产品推荐

