释放指向结构体的指针的内存

Free the memory of a pointer to a struct

本文关键字:指针 内存 结构体 释放      更新时间:2023-10-16

我是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语句抛出了某种异常。

我做错了什么?谢谢你的帮助。

您需要在压入堆栈后delete p。堆栈存储了它自己的对象副本,因此在弹出后不需要对它做任何操作。

但真正的解决方案是首先不使用new:

Person p = {"name", 211};
...
stack.push(p);

还是

stack.push(Person{"name", 211});
然后

Person current = stack.front();
stack.pop();

所以,不需要直接处理内存管理

当你将某个对象压入堆栈时,你不是压入原始对象,而是压入对象的副本。要释放原始对象的内存,您需要在压下它之后立即执行此操作。

或者你可以跳过这一步,一开始就不使用new来创建对象:

Person p;
p.name = "name";
p.age = 211;
stack.push(p);

你不需要做一个指针。如果需要,那么使用智能指针为您释放内存:
std::unique_ptr<Person> p(new Person);