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

在map::insert中使用new创建的对象是否需要手动delete?

错误根源

你崩溃的直接原因是new和delete的匹配规则错误:

  • 单个对象用new分配,必须用delete释放
  • 数组对象用new[]分配,才需要用delete[]释放
    你代码中创建对象用的是new Object(单个对象分配),析构里用delete[] val释放,属于未定义行为,直接触发内存访问错误。

其他潜在问题

你的AddObject函数返回值是Object值类型,会触发对象拷贝:如果Object类没有正确实现拷贝构造函数,后续还可能出现二次释放、浅拷贝数据异常等问题。如果需要返回创建的原对象,建议修改返回值为Object&或Object*。

修复代码

1. 修正析构释放逻辑

Scene::~Scene() {
    for (auto const& [key, val] : view_layer)
    {
        if(val){
            std::cout << "Deleting object...\n";
            delete val;
        }
    }
};

2. 可选优化(推荐)

C++11及以上版本可以用智能指针替代裸指针管理内存,完全避免手动释放的风险:

  • 修改map声明:std::map<GLuint, std::unique_ptr<Object>> view_layer;
  • AddObject中插入逻辑改为:view_layer.insert(std::make_pair(currentObjectID, std::make_unique<Object>()));
  • 不需要手动写析构释放逻辑,map销毁时会自动释放所有对象内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:27:03