【发布时间】:2015-02-12 12:45:49
【问题描述】:
MyClass* po = new MyClass();
po->DoSomething();
和
MyClass po;
MyClass* pp = &po;
pp->DoSomething();
你能解释一下这包括堆栈和堆中会发生什么吗?
【问题讨论】:
标签: c++ object pointers heap-memory stack-memory
MyClass* po = new MyClass();
po->DoSomething();
和
MyClass po;
MyClass* pp = &po;
pp->DoSomething();
你能解释一下这包括堆栈和堆中会发生什么吗?
【问题讨论】:
标签: c++ object pointers heap-memory stack-memory
区别在于分配内存的方式。
MyClass* po = new MyClass(); 从堆中分配内存并返回指针。您可以使用给定的指针访问内存。MyClass po; 在堆栈上分配内存。离开作用域后(函数返回时),即使有指针也无法访问此内存。【讨论】:
第一种情况是使用堆中的动态内存分配创建 MyClass 类型的实例。当你离开作用域时,指向 po 的对象仍然会存在于堆中,如果不考虑会留下内存泄漏。
第二个是在堆栈上实例化 MyClass 的一个实例。然后你创建一个指向 MyClass 类型的指针,指向堆栈上的对象。离开作用域时,po会被销毁,pp指向的对象也会失效。
【讨论】:
new 在 free store 上分配内存,而 C 风格的 malloc 在 heap 上分配内存>。它们由单独的内存管理器处理,这就是为什么您不应该将new 和delete 与malloc 和free 混合使用。