下面的代码创建在栈上的对象:
Object o;
当创建在堆上的对象,我们可以使用:
Object* o;
o = new Object();
而不是:
Object* o = new Object();
当我们在两行分裂堆对象创建并调用在第二行上的构造( o = new object()
这意味着在第一行( Object* o
)的指针被在堆栈上产生的? 因此Object o
把堆栈上的对象,而Object* o
把指针未来对象在堆栈上?
我的第二个问题涉及到如果两行代码被称为类之外。 最近,我读( 在C全局内存管理堆栈或堆? )全局变量不包含在堆栈/堆但是记忆里却另一部分? 如果是这样的情况下,将Object* o
创建一个指针,它会坐在内存这另一部分,它指向堆对象?
其实,无论声明说,大约堆或叠东西:
Object o;
创建具有自动存储意味着该存储位置由在其中对象被声明的上下文确定的对象:如果代码是在一个函数,这正好是调用堆栈。 但线也可以是一个类成员,或者,因为你已经注意到,一个函数/类之外。
为了说明为什么这是不同的:
struct Foo {
Object o;
};
Foo* pf = new Foo();
现在对象pf->o
是在堆上创建的,而不是在堆栈中,即使(或更确切地说, 因为 )它具有自动存储。
反过来,
Object* p;
只是声明了一个指针,仅此而已。 指针的存储是从任何其他对象的不可区分的:它具有自动存储。 此外,初始化表达对变量存储没有影响。
什么指针指向是完全不同的事情。 这可能是一个堆分配对象(使用new
的实例),或者它可能指向另一个自动分配的对象。 考虑:
Object o;
Object* p = &o;
C ++提供了三种不同的方法来创建对象:
- 基于堆栈如临时对象
- 基于堆的使用新
- 静态内存分配,如全局变量和命名空间范围的对象
考虑你的情况下,
Object* o;
o = new Object();
和:
Object* o = new Object();
这两种形式是相同的。 这意味着,一个指针变量o是在堆栈上创建的(假设的变量不属于类别3以上)和其指向在堆,它包含对象的存储器。
这两种形式是有一个例外相同的:暂时,新的(Object *)
有一个未定义的值时,创建和分配是分开的。 编译器可将它们组合到一起,由于未定义指针不是特别有用。 这不涉及到全局变量(除非该声明是全球性的,在这种情况下,它仍然是正确的两种形式)。
一个)
Object* o;
o = new Object();
``B)
Object* o = new Object();
我觉得A和B具有无差异。 在这两种情况下o是一个指针,指向类对象。 声明新的对象()创建一个从堆内存Object类的一个对象。 赋值语句指定分配的内存来Ø指针的地址。
有一两件事我想提一提从堆中分配的内存是大小始终的sizeof(对象)不是的sizeof(对象)+的sizeof(void *的)。
在这两个你的例子,局部变量Object*
类型被分配在堆栈上。 编译器是免费的,以从两个片段相同的代码,如果没有办法为你的程序来检测差异。
全局变量的存储区是一样的静态变量的存储区域 - 这是既不在堆栈也没有对堆。 您可以通过声明他们将在这方面变量static
函数内部。 这样做的后果是,该实例成为你的函数的并发调用中共享 ,所以你需要在使用静态仔细考虑同步。
这里是一个链接到正在运行的C程序的内存布局的讨论。