动态内存释放触发异常:如何修正delete[] msgs与imageFile语句?
问题根源:栈数组误用
delete[] 你遇到的异常核心原因很明确:msgs和imageFile是栈上分配的数组,它们的内存由编译器自动管理,完全不需要(也绝对不能)用delete[]来释放。delete[]的作用仅针对通过new[]在堆上动态分配的数组内存,对栈数组调用它会直接触发未定义行为,也就是你看到的崩溃异常。
正确的内存释放方式
你要做的是逐个释放数组中每个用new创建的元素,而不是释放数组本身:
- 先遍历
msgs数组,对每个Msg*元素调用delete(因为每个元素是单个new出来的对象,不是new[]数组,所以用delete而非delete[]) - 再遍历
imageFile数组,对每个Image*元素调用delete
修改后的main函数末尾代码如下:
int main() { Image* imageFile[] = { new Image(), new Image(), new Image() }; Msg* msgs[] = { new Text_Msg(1230, "성훈", "안녕, 우리 강아지 사진 보내줄게 !"), new Image_Msg(1231, "성훈", imageFile[0]), new Image_Msg(1231, "성훈", imageFile[1]), new Image_Msg(1231, "성훈", imageFile[2]), new Text_Msg(1232, "민주", "와 진짜 귀엽다!"), new Text_Msg(1235, "성훈", "그치! 담에 놀러와~~"), new Text_Msg(1237, "민주", "응 안녕~!") }; for (Msg* m : msgs) { printMsg(*m); }; // 正确释放内存:先释放msgs里的每个动态对象 for (Msg* m : msgs) { delete m; } // 再释放imageFile里的每个动态对象 for (Image* img : imageFile) { delete img; } // 注意:不需要delete[] msgs或delete[] imageFile,它们是栈数组,程序结束后自动回收 }
额外优化:用智能指针彻底避免手动内存管理
如果你的项目支持C++11及以上标准,强烈推荐使用std::unique_ptr或std::shared_ptr这类智能指针,它们会自动帮你管理动态内存,完全不用手动写delete,从根源上杜绝内存泄漏或释放错误:
#include <memory> // ...保留原有的其他头文件和类定义 int main() { std::unique_ptr<Image> imageFile[] = { std::make_unique<Image>(), std::make_unique<Image>(), std::make_unique<Image>() }; std::unique_ptr<Msg> msgs[] = { std::make_unique<Text_Msg>(1230, "성훈", "안녕, 우리 강아지 사진 보내줄게 !"), std::make_unique<Image_Msg>(1231, "성훈", imageFile[0].get()), std::make_unique<Image_Msg>(1231, "성훈", imageFile[1].get()), std::make_unique<Image_Msg>(1231, "성훈", imageFile[2].get()), std::make_unique<Text_Msg>(1232, "민주", "와 진짜 귀엽다!"), std::make_unique<Text_Msg>(1235, "성훈", "그치! 담에 놀러와~~"), std::make_unique<Text_Msg>(1237, "민주", "응 안녕~!") }; for (auto& m : msgs) { printMsg(*m); }; // 这里不需要任何delete操作,智能指针会在生命周期结束时自动释放内存 }
内容的提问来源于stack exchange,提问作者Satthew Seong Hun Moon




