我是C++
的新手并实施了以下struct
:
struct Person {
String name;
int age;
};
现在我创建一个新对象:
Person *p = new Person();
p->name = "name";
p->age = 211;
和push
到stack
:
stack.push(*p);
我有一个while(!stack.empty())
表达式,在那里我处理我推入堆栈的每个元素
现在我在哪里释放内存?在while
- 循环中,我执行以下操作:
Person *current = &stack.front();
stack.pop();
// do stuff
delete current;
可悲的是,delete current
语句引发了某种异常。
我做错了什么?谢谢你的帮助。
答案 0 :(得分:8)
推入堆栈后需要delete p
。堆栈存储了自己的对象副本,因此在弹出后不需要对它做任何事情。
但真正的解决方案是首先不要使用new
:
Person p = {"name", 211};
...
stack.push(p);
或只是
stack.push(Person{"name", 211});
然后
Person current = stack.front();
stack.pop();
因此,无需直接处理内存管理。
答案 1 :(得分:4)
当您将某些东西推到堆叠上时,您不会推动原始对象 - 您推送该对象的副本。要释放原始对象的内存,您需要在推动它之后立即执行此操作。
或者你可以完全跳过它,并且不首先使用new
来创建对象:
Person p;
p.name = "name";
p.age = 211;
stack.push(p);
答案 2 :(得分:0)
你不需要制作指针。如果必须,请使用智能指针为您释放内存:
std::unique_ptr<Person> p(new Person);