【问题标题】:How should class fields be declared in C++?类字段应该如何在 C++ 中声明?
【发布时间】:2016-11-30 15:29:32
【问题描述】:

我需要将向量声明并初始化为名为@9​​87654321@ 的类的字段。

我在这两种声明方法之间纠结,第一种是“在堆上”,第二种是“在栈上”(或者至少,这是我的解释)。

  1. vector<int>* field = new vector<int>();
  2. vector<int> field = vector<int>();

如果我选择在样式1中声明,我需要在类的析构函数中调用delete。

我应该选择哪一个,为什么?

另外,如果类在堆上初始化(即PixelOperator* op = new PixelOperator();),在栈上初始化的字段是否在堆上初始化?

【问题讨论】:

    标签: c++ class initialization field declaration


    【解决方案1】:

    选择方法 2。这会将对象放入堆栈,但向量的实现很可能会将内容放入堆中。

    另外,你的意思颠倒了。 1 在堆上,2 在栈上。 1 将需要删除。

    【讨论】:

    • 正确,只是方法2会将向量放在PixelOperator对象所在的任何位置,可能在堆栈上(PixelOperator pix;),也可能在堆上(PixelOperator* pix = new PixelOperator; )。
    【解决方案2】:

    在这种情况下,您的直觉是错误的。方法(2)不一定将向量放在堆栈上。如果 PixelOperator 对象在本地声明并因此放入堆栈,则向量也将放入堆栈,但是如果使用 new 运算符将 PixelOperator 对象放入堆中,则向量也会作为该对象的一部分放入堆中。这种情况的不同之处在于,在方法(2)中,向量是与其他对象字段一起的连续内存块的一部分,而在方法(1)中,包含对象的内存块中包含另一个块的地址内存,其中包含向量。当然,在方法 (1) 中,无论 PixelOperator 对象是放在堆上还是放在堆栈上,向量都会在堆上结束。方法 (2) 通常更受欢迎,因为它可以更透明地确定对象的分配位置。

    【讨论】:

      【解决方案3】:

      没有什么可以偶然发现的。从来没有理由在堆上分配std::vector<>(或任何其他标准容器)。永远不要这样做,你会没事的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        相关资源
        最近更新 更多