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 很重要(基本上,所有内置类型,如 int
、bool
、double
等,以及仅从其他 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++栈变量和堆变量的主要内容,如果未能解决你的问题,请参考以下文章