class 字段应该如何在 C++ 中声明?
How should class fields be declared in C++?
我需要将一个向量声明并初始化为一个名为 PixelOperator
的 class 的字段。
我在这两种声明方法之间纠结,第一种是"on the heap",第二种是"on the stack"(或者至少,这是我的解释)。
vector<int>* field = new vector<int>();
vector<int> field = vector<int>();
如果我选择在样式 1 中声明,我需要在 class.
的析构函数中调用 delete
我应该选择哪一个,为什么?
此外,如果class是在堆上初始化的(即PixelOperator* op = new PixelOperator();
),那么在栈上初始化的字段是否在堆上初始化?
选择方法 2。这会将对象放在堆栈上,但向量的实现很可能会将内容放在堆上。
另外,你把意思弄反了。 1 在堆上,2 在堆栈上。 1 将需要删除。
没什么可绊倒的。从来没有理由在堆上分配 std::vector<>
(或与此相关的任何其他标准容器)。永远不要这样做,你会没事的。
在这种情况下,您的直觉是错误的。方法 (2) 不一定将向量放在堆栈上。如果在本地声明 PixelOperator 对象并因此将其放入堆栈,则向量也会放入堆栈,但是如果使用 new 运算符将 PixelOperator 对象放入堆中,则向量也会作为其中的一部分放入堆中对象。此实例的不同之处在于,在方法 (2) 中,向量是与其他对象字段一起的连续内存块的一部分,而在方法 (1) 中,包含对象的内存块中包含另一个块的地址内存,其中包含向量。当然,在方法 (1) 中,无论 PixelOperator 对象是放在堆上还是堆栈上,向量最终都在堆上。方法 (2) 通常更可取,因为它可以更透明地确定对象的分配位置。
我需要将一个向量声明并初始化为一个名为 PixelOperator
的 class 的字段。
我在这两种声明方法之间纠结,第一种是"on the heap",第二种是"on the stack"(或者至少,这是我的解释)。
vector<int>* field = new vector<int>();
vector<int> field = vector<int>();
如果我选择在样式 1 中声明,我需要在 class.
的析构函数中调用 delete我应该选择哪一个,为什么?
此外,如果class是在堆上初始化的(即PixelOperator* op = new PixelOperator();
),那么在栈上初始化的字段是否在堆上初始化?
选择方法 2。这会将对象放在堆栈上,但向量的实现很可能会将内容放在堆上。
另外,你把意思弄反了。 1 在堆上,2 在堆栈上。 1 将需要删除。
没什么可绊倒的。从来没有理由在堆上分配 std::vector<>
(或与此相关的任何其他标准容器)。永远不要这样做,你会没事的。
在这种情况下,您的直觉是错误的。方法 (2) 不一定将向量放在堆栈上。如果在本地声明 PixelOperator 对象并因此将其放入堆栈,则向量也会放入堆栈,但是如果使用 new 运算符将 PixelOperator 对象放入堆中,则向量也会作为其中的一部分放入堆中对象。此实例的不同之处在于,在方法 (2) 中,向量是与其他对象字段一起的连续内存块的一部分,而在方法 (1) 中,包含对象的内存块中包含另一个块的地址内存,其中包含向量。当然,在方法 (1) 中,无论 PixelOperator 对象是放在堆上还是堆栈上,向量最终都在堆上。方法 (2) 通常更可取,因为它可以更透明地确定对象的分配位置。