C ++堆栈变量和堆变量

时间:2010-09-17 13:45:48

标签: c++ object stack heap

当你在C ++中创建一个存在于堆栈中的新对象时(我大多看到它的方式)你会这样做:

CDPlayer player;

在堆上创建对象时,请调用new

CDPlayer* player = new CDPlayer();

但是当你这样做时:

CDPlayer player=CDPlayer();

它会创建一个基于堆栈的对象,但它与顶级示例之间的区别是什么?

3 个答案:

答案 0 :(得分:22)

差异对于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,则避免初始化已分配的对象。)

答案 1 :(得分:8)

  

当您在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.

答案 2 :(得分:0)

CDPlayer* player = new CDPlayer();

这实际上是在堆栈上创建一个指针并使其指向堆上分配的CDPlayer对象。