【问题标题】:What is the difference between below two methods in c++c ++中以下两种方法有什么区别
【发布时间】: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


    【解决方案1】:

    区别在于分配内存的方式。

    1. MyClass* po = new MyClass(); 从堆中分配内存并返回指针。您可以使用给定的指针访问内存。
    2. MyClass po; 在堆栈上分配内存。离开作用域后(函数返回时),即使有指针也无法访问此内存。

    【讨论】:

      【解决方案2】:

      第一种情况是使用堆中的动态内存分配创建 MyClass 类型的实例。当你离开作用域时,指向 po 的对象仍然会存在于堆中,如果不考虑会留下内存泄漏。

      第二个是在堆栈上实例化 MyClass 的一个实例。然后你创建一个指向 MyClass 类型的指针,指向堆栈上的对象。离开作用域时,po会被销毁,pp指向的对象也会失效。

      【讨论】:

      • 离开范围是什么意思?
      • @malit.tilak 如果您在函数内本地声明一个变量,则该变量的作用域就是该函数。一旦函数返回,作用域结束,变量将不复存在。比这复杂一点,因为作用域可以嵌套,结构、类和命名空间也引入了它们自己的作用域。
      • 我想指出 C++ 的 newfree store 上分配内存,而 C 风格的 mallocheap 上分配内存>。它们由单独的内存管理器处理,这就是为什么您不应该将newdeletemallocfree 混合使用。
      • 把小的东西(这样你就不会耗尽你的堆栈)和临时的东西放在堆栈上——例如,这些是你在函数中的局部变量。您希望那些在堆栈上或 CPU 中的寄存器上,例如迭代器、指向堆的指针本身或您希望减少 cpu 内存管理器打开页面的小缓冲区工作区。
      • 谢谢@GeorgeHoupis 我很清楚这个想法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2013-09-08
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多