我需要将一个向量声明并初始化为一个名为PixelOperator
的类的字段。
我在这两种声明方法之间徘徊,第一种是#34;在堆#34;上,第二种是#34;在堆栈上#34; (或者至少,这是我的解释)。
vector<int>* field = new vector<int>();
vector<int> field = vector<int>();
如果我选择在样式编号1中声明,我需要在类的析构函数中调用delete。
我应该选择哪一个?为什么?
另外,如果在堆上初始化类(即PixelOperator* op = new PixelOperator();
),那么在堆上初始化的字段上是否初始化了字段?
答案 0 :(得分:3)
选择方法2.这会将对象放在堆栈上,但是向量的实现很可能将内容放在堆上。
另外,你的意思是相反的。 1在堆上,2在堆栈上。 1将需要删除。
答案 1 :(得分:2)
在这种情况下,你的直觉是错误的。方法(2)不一定将矢量放在堆栈上。如果PixelOperator对象在本地声明并因此放在堆栈上,那么向量也会放在堆栈上,但是如果使用new运算符将PixelOperator对象放在堆上,则该向量也会作为该对象的一部分放在堆上/ strong>即可。这种情况的不同之处在于,在方法(2)中,向量是连续的内存块与其他对象字段的一部分,并且在方法(1)中,包含对象的内存块在其中具有另一个块的地址内存,包含向量。当然,在方法(1)中,无论PixelOperator对象是放在堆上还是放在堆栈上,向量都会在堆上结束。方法(2)通常是更理想的,因为它允许更透明地确定对象的分配位置。
答案 2 :(得分:1)
没有什么可以绊倒的。永远不会有理由在堆上分配Pattern pattern = Pattern.compile("\\p{Cntrl}");
Matcher matcher = pattern.matcher(str);
String controlChar = matcher.group();
String replace = "\\" + controlChar;
result = result.replace(controlChar, replace);
(或任何其他标准容器)。只是永远不要这样做,你会没事的。