在堆栈/堆上创建对象?
以下代码在堆栈上创建一个对象:
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 creation on the stack/heap?
下一篇: stroke inside path