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()代码>
向量场=向量()代码>
另外,如果类在堆上初始化(即,
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;
)。