在堆栈/堆上创建对象?

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

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 *)有一个未定义的值。 编译器可能会将它们组合在一起,因为未定义的指针不是特别有用。 这不涉及全局变量(除非声明是全局的,在这种情况下,对于这两种形式都是如此)。

    链接地址: http://www.djcxy.com/p/13863.html

    上一篇: Object creation on the stack/heap?

    下一篇: stroke inside path