如果在 map::insert() 中使用 "new" 运算符创建变量,我应该删除它们吗?

Should I delete variables if created them using "new" operator inside map::insert()?

我正在编写场景管理器,其中包含所有对象的映射,或者更确切地说是指向它们的指针。我记得 delete 我使用“new”创建的变量,我尝试在我的场景解构器中这样做,但我得到了 0xC0000005 退出代码和 afaik 这意味着我试图使用不再存在的内存。 这是我的场景 class:

class Scene{
public:
    Scene();
    ~Scene();

    // other functions that I cut for question purposes

    std::map<GLuint, Object*> view_layer;
    Object AddObject(const std::string &title);
};

我正在这样的场景中创建新对象(“新对象”returns 仅指向新创建的变量):

Object Scene::AddObject(const std::string &title) {
    
    // other stuff again

    view_layer.insert(std::make_pair(currentObjectID, new Object));
    return *view_layer.find(currentObjectID)->second;
}

我试过这样删除它:

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

但是程序在这 std::cout 之后崩溃,就在删除 [] val.

Val 应该是对我的对象指针的引用,而 delete [] 需要指针,所以我想我这里没有语法问题。

我的问题是 - 我是不是做错了什么,或者我只是不应该删除它,因为它会以某种方式自行删除? 感谢您提供任何帮助!

所以.. 正如 t.niese 回答 0xC0000005 我的代码中的退出状态来自创建和删除使用的方法之间的差异。

当使用 new 时,您应该使用 delete 删除它 使用new[]时,应该使用delete[]