C++ 类字段应该如何在C++;?

C++ 类字段应该如何在C++;?,c++,class,initialization,field,declaration,C++,Class,Initialization,Field,Declaration,我需要声明一个向量并将其初始化为名为PixelOperator的类的字段 我在这两种声明方法之间左右为难,第一种是“在堆上”,第二种是“在堆栈上”(或者至少,这是我的解释) vector*field=newvector() 向量场=向量() 如果我选择以样式1声明,我需要在类的析构函数中调用delete 我应该选择哪一个,为什么 另外,如果类在堆上初始化(即,PixelOperator*op=new PixelOperator();),堆栈上的字段是否在堆上初始化?选择方法2。这会将对象放在堆栈

我需要声明一个向量并将其初始化为名为
PixelOperator
的类的字段

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

  • vector*field=newvector()
  • 向量场=向量()
  • 如果我选择以样式1声明,我需要在类的析构函数中调用delete

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


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

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


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

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


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

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

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

    在这种情况下,你的直觉是错误的。方法(2)不一定把向量放在堆栈上。如果本地声明了PixelOperator对象并因此放在堆栈上,那么向量也会放在堆栈上,但是如果使用新操作符将PixelOperator对象放在堆上,那么向量也会作为该对象的一部分放在堆上。这种情况下的区别在于,在方法(2)中,向量与其他对象字段一起是连续内存块的一部分,而在方法(1)中,包含对象的内存块中有另一个包含向量的内存块的地址。当然,在方法(1)中,不管PixelOperator对象是放在堆上还是堆栈上,向量最终都放在堆上。方法(2)通常更可取,因为它允许更透明地确定对象的分配位置。

    在这种情况下,您的直觉是错误的。方法(2)不一定把向量放在堆栈上。如果本地声明了PixelOperator对象并因此放在堆栈上,那么向量也会放在堆栈上,但是如果使用新操作符将PixelOperator对象放在堆上,那么向量也会作为该对象的一部分放在堆上。这种情况下的区别在于,在方法(2)中,向量与其他对象字段一起是连续内存块的一部分,而在方法(1)中,包含对象的内存块中有另一个包含向量的内存块的地址。当然,在方法(1)中,不管PixelOperator对象是放在堆上还是堆栈上,向量最终都放在堆上。方法(2)通常更可取,因为它允许更透明地确定对象的分配位置。

    正确,但方法2将向量放在放置
    PixelOperator
    对象的任何位置,该对象可能在堆栈上(
    PixelOperator pix;
    ),也可能在堆上(
    PixelOperator*pix=new PixelOperator;
    )。正确,但方法2将把向量放在放置
    PixelOperator
    对象的任何位置,该对象可能在堆栈上(
    PixelOperator-pix;
    ),也可能在堆上(
    PixelOperator*pix=new PixelOperator;
    )。