You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

动态内存释放触发异常:如何修正delete[] msgs与imageFile语句?

问题根源:栈数组误用delete[]

你遇到的异常核心原因很明确:msgsimageFile栈上分配的数组,它们的内存由编译器自动管理,完全不需要(也绝对不能)用delete[]来释放。delete[]的作用仅针对通过new[]在堆上动态分配的数组内存,对栈数组调用它会直接触发未定义行为,也就是你看到的崩溃异常。


正确的内存释放方式

你要做的是逐个释放数组中每个用new创建的元素,而不是释放数组本身:

  1. 先遍历msgs数组,对每个Msg*元素调用delete(因为每个元素是单个new出来的对象,不是new[]数组,所以用delete而非delete[]
  2. 再遍历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_ptrstd::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

火山引擎 最新活动