有这个代码:
void set(list<Person*>* listP){
Person timmy = Person(10);
listP->push_back(&timmy);
}
int main()
{
list<Person*> listP;
set(&listP);
Person* timmy = listP.back();
}
如果我理解正确(请纠正我)timmy 分配在堆栈上,所以当我在 main 中使用它们时我不能指望 timmy 的值。我对么?我需要像这样创建 timmy 吗:
Person* timmy = new Person(10);
为了在堆上创建而不是在栈上,方法返回后不会被销毁?
谢谢
最佳答案
void set(list<Person*>* listP){
Person timmy = Person(10); // create timmy on automatic storage (stack)
listP->push_back(&timmy); //push timmy's address
} //timmy is destroyed. pushed address points to deallocated memory
是的,您需要使用 Person* timmy = new Person(10);
在堆上分配。
void set(list<Person*>* listP){
Person *timmy = new Person(10); // timmy is a pointer now
listP->push_back(timmy); //push timmy's copy (copy of pointer)
} //timmy (pointer) is destroyed, but not the memory it points to
也喜欢使用 smart_pointers
,例如 std::shared_ptr
、std::unique_ptr
或 boost
smart指针。它将简化内存管理和编写异常安全
代码
关于c++ - 更好地理解堆栈和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11738616/