C++栈变量和堆变量

Posted

技术标签:

【中文标题】C++栈变量和堆变量【英文标题】:C++ stack variables and heap variables 【发布时间】:2011-04-13 17:53:07 【问题描述】:

当您在 C++ 中创建一个位于堆栈上的新对象时,(我经常看到它的方式)您会这样做:

CDPlayer player;

当你在堆上创建一个对象时,你调用new

CDPlayer* player = new CDPlayer();

但是当你这样做时:

CDPlayer player=CDPlayer();

它创建了一个基于堆栈的对象,但它和上面的例子有什么区别?

【问题讨论】:

Do the parentheses after the type name make a difference with new? 的可能重复项 【参考方案1】:

区别对于 POD 很重要(基本上,所有内置类型,如 intbooldouble 等,以及仅从其他 POD 构建的类 C 结构和联合),其中有一个默认初始化值初始化的区别。对于 POD,一个简单的

T obj;

将保持obj 未初始化,而T() 默认初始化对象。所以

T obj = T();

是确保对象正确初始化的好方法。

这在模板代码中特别有用,其中T 可能是 POD 或非 POD 类型。当您知道 T 不是 POD 类型时,T obj; 就足够了。

附录:你也可以写

T* ptr = new T; // note the missing ()

(如果T 是 POD,则避免初始化分配的对象)。

【讨论】:

用户定义的类型也可以是 POD,在这种情况下,当没有进行显式初始化时,它们的行为就像内置的。 @Konrad:你说得对,区别在于 POD 和非 POD!感谢您指出这一点,我相应地更改了答案。 在 C++0x 中,您可以使用 T obj; 确保正确初始化。 还有一些其他的区别...T obj = T() 要求复制构造函数可用(即使编译器会忽略复制)。 @FredOverflow:这不是声明一个函数吗?【参考方案2】:

当您在 C++ 中创建一个位于堆栈上的新对象时,(...) 您可以这样做:

CDPlayer player;

不一定在堆栈上:以这种方式声明的变量具有自动存储。他们实际去哪里取决于。它可能在堆栈上(特别是当声明在方法内部时),但也可能在其他地方。

考虑声明在类内部的情况:

class foo 
    int x;
;

现在x 的存储位置是存储类实例的位置。如果它存储在堆上,那么x也是如此:

foo* pf = new foo(); // pf.x lives on the heap.
foo f; // f.x lives where f lives, which has (once again) automatic storage.

【讨论】:

@Tony:这真的回答了这个问题吗?它的意思是补充评论……。它根本不会触及您的第一个和第三个代码之间的区别,因为其他答案已经这样做了。

以上是关于C++栈变量和堆变量的主要内容,如果未能解决你的问题,请参考以下文章

栈内存和堆内存

初识栈内存和堆内存

全局变量和局部变量

java栈和堆区别

栈和堆有什么不同之处

浅析JAVA中栈内存和堆内存