c++ - 更好地理解堆栈和列表

标签 c++ heap-memory

有这个代码:

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_ptrstd::unique_ptrboost smart指针。它将简化内存管理和编写异常安全代码

关于c++ - 更好地理解堆栈和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11738616/

相关文章:

c++ - 将面板添加到 MFC 应用程序 (Visual Studio C++)

c++ - boost 的 dijkstra_shortest_paths 中的负边权重检查

c++ - STL 喜欢容器 typedef 快捷方式?

java - 哪个内存用于从 java 运行的外部进程 - java 堆空间或操作系统内存?

java - 在 JVM 上禁用本地 JMX 连接

c++ - 在 Windows 上使用带有 Cxx.jl 的 Julia 中的 boost 库

c++ - SFINAE 和 decltype(自动)

汇编 - 堆对齐 - x86 intel

设置环境变量后 Elasticsearch 报告默认堆内存大小

c - 虚拟地址是特定于进程的吗?