C++堆栈变量和堆变量

Ton*_*ion 9 c++ heap stack object

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

CDPlayer player;
Run Code Online (Sandbox Code Playgroud)

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

CDPlayer* player = new CDPlayer();
Run Code Online (Sandbox Code Playgroud)

但是当你这样做时:

CDPlayer player=CDPlayer();
Run Code Online (Sandbox Code Playgroud)

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

sbi*_*sbi 22

所不同的是,带豆荚(基本上,所有内置类型,如重要的int,bool,double等加C状结构,只有从其他荚建工会),针对其存在的差异缺省初始化值初始化.对于POD,一个简单的

T obj;
Run Code Online (Sandbox Code Playgroud)

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

T obj = T();
Run Code Online (Sandbox Code Playgroud)

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

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

附录:你也可以写

T* ptr = new T; // note the missing ()
Run Code Online (Sandbox Code Playgroud)

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

  • 用户定义的类型也可以是POD,在这种情况下,当没有进行显式初始化时,它们的行为类似于内置函数. (2认同)
  • 还有其他一些差异......`T obj = T()`要求复制构造函数可用(即使编译器会删除副本). (2认同)

Kon*_*lph 8

当您在C++中创建一个存在于堆栈中的新对象时,(...)执行此操作:

CDPlayer player;
Run Code Online (Sandbox Code Playgroud)

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

考虑声明在类中的情况:

class foo {
    int x;
};
Run Code Online (Sandbox Code Playgroud)

现在存储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.
Run Code Online (Sandbox Code Playgroud)

  • @Tony:这真的回答了这个问题吗?它更像是一个补充评论...... 它根本没有触及你的第一个和第三个代码之间的差异,因为其他答案已经完成了. (4认同)