我有一个名为Array2D的类,其中包含一个复制构造函数Array2D(const Array2D&)
。我遇到的问题是,无论何时调用复制构造函数,我的程序都会停止。构造函数是:
Array2D(const Array2D& arr) {
Array2D(arr.rows, arr.cols); //Sets the variables cols and rows and
//sets a pointer T* ptr = new T[rows*cols]
for(size_t i = 0; i < rows*cols; i++)
ptr[i] = arr.ptr[i];
}
我将其他构造函数的调用移到了构造函数列表中:
Array2D(const Array2D& arr)
: Array2D(arr.rows, arr.cols) {
for(size_t i = 0; i < rows*cols; i++)
ptr[i] = arr.ptr[i];
}
有人可以告诉我为什么代码的第二个版本可以工作而第二个版本没有?
P.S。:这是从复制构造函数调用的构造函数。
Array2D(size_t r, size_t c)
: rows(r), cols(c), ptr(new T[r*c]) {}
答案 0 :(得分:4)
在
Array2D(const Array2D& arr) {
Array2D(arr.rows, arr.cols); //Sets the variables cols and rows and
//sets a pointer T* ptr = new T[rows*cols]
for(size_t i = 0; i < rows*cols; i++)
ptr[i] = arr.ptr[i];
}
Array2D(arr.rows, arr.cols);
基本上是非操作。它会创建一个临时的Array2d
,然后它就会被销毁。这意味着ptr
永远不会被初始化,使用它是undefined behavior。
使用
Array2D(const Array2D& arr)
: Array2D(arr.rows, arr.cols) {
for(size_t i = 0; i < rows*cols; i++)
ptr[i] = arr.ptr[i];
}
使用委托构造函数初始化成员变量,然后设置数组元素。