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 ,则避免初始化已分配的对象).
当您在C++中创建一个存在于堆栈中的新对象时,(...)执行此操作:
Run Code Online (Sandbox Code Playgroud)CDPlayer player;
不一定在堆栈上:以这种方式声明的变量具有自动存储.他们实际去哪里取决于.它可能在堆栈上(特别是当声明在方法内部时),但它也可能在其他地方.
考虑声明在类中的情况:
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)