在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
相关产品推荐
相关产品推荐

