如果在 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[]
我正在编写场景管理器,其中包含所有对象的映射,或者更确切地说是指向它们的指针。我记得 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[]