在堆栈/堆创build对象?

以下代码在堆栈上创build一个对象:

Object o; 

在堆上创build对象时,我们可以使用:

 Object* o; o = new Object(); 

而不是:

 Object* o = new Object(); 

当我们将堆对象创build分成两行并在第二行调用构造函数( o = new object() )时,这是否意味着在第一行( Object* o )指针是在堆栈上创build的? 所以Object o把对象放在堆栈上,而Object* o把指针放在堆栈上的未来对象上?

我的第二个问题涉及到两行代码是否在类之外被调用。 我最近读( 全局内存pipe理在C堆栈或堆? )全局variables不包含在堆栈/堆,但实际上是另一部分内存? 如果是这样的话, Object* o创build一个指针,该指针位于内存的另一部分,并指向堆对象?

实际上,这两个声明都没有提到堆或栈的内容:

 Object o; 

创build一个具有自动存储的对象,这意味着存储位置是由声明对象的上下文决定的:如果代码在函数中,这恰好是调用堆栈。 但是该行也可以是一个类成员,或者如你所指出的,在一个函数/类之外。

为了说明为什么这是不同的:

 struct Foo { Object o; }; Foo* pf = new Foo(); 

现在,对象pf->o在堆上创build ,而不是在堆栈上,即使(或者说, 因为 )它具有自动存储。

反过来,

 Object* p; 

只是声明一个指针,没有什么更多。 指针的存储与其他对象无法区分:它具有自动存储。 此外,初始化expression式对variables存储没有影响。

指针指向的是完全不同的问题。 它可能是一个堆分配的对象(使用new的例子),也可能指向另一个自动分配的对象。 考虑:

 Object o; Object* p = &o; 

C ++提供了三种不同的方法来创build对象:

  1. 基于堆栈的,如临时对象
  2. 基于堆的使用新的
  3. 静态内存分配,如全局variables和命名空间范围对象

考虑你的情况,

 Object* o; o = new Object(); 

和:

 Object* o = new Object(); 

两种forms都是一样的。 这意味着在堆栈上创build了一个指针variableso(假设你的variables不属于上面的3类),它指向堆中的一个内存,该内存包含对象。

这两种forms是相同的,只有一个例外:当创build和赋值是分开的时候,新的(Object *)有一个未定义的值。 编译器可以将它们组合起来,因为未定义的指针不是特别有用。 这不涉及全局variables(除非声明是全局的,在这种情况下,对于这两种forms都是一样的)。

在这两个例子中, Object*types的局部variables都被分配在堆栈上。 如果您的程序无法检测到差异,则编译器可以自由地从这两个片段中生成相同的代码。

全局variables的内存区域与静态variables的内存区域相同,既不在堆栈中,也不在堆中。 您可以通过在函数中声明它们来将variables放置在该区域中。 这样做的结果是实例在您的函数的并发调用之间共享 ,因此您在使用静态时需要仔细考虑同步。

这是一个讨论正在运行的C程序的内存布局的链接 。

一个)

 Object* o; o = new Object(); 

“B)

 Object* o = new Object(); 

我认为A和B没有区别。 在这两种情况下,o是一个指向类Object的指针。 语句new Object()从堆内存中创buildObject类的对象。 赋值语句将指定内存的地址赋给指针o。

有一件事我想提到从堆分配内存的大小总是sizeof(Object)not sizeof(Object)+ sizeof(void *)。