我为我的构造函数编写了以下实现:
template<class T>
Matrix<T>::Matrix(const Dimensions &matrix_dimensions, const T &initial_value) : dimensions(matrix_dimensions),
data(new T[size()]) {
if (matrix_dimensions.getRow() <= 0 || matrix_dimensions.getCol() <= 0) {
return IllegalInitialization();
}
int matrix_size = size();
for (int i = 0; i < matrix_size; ++i) {
data[i] = initial_value;
}
}
因此,如果发生错误,我将返回IllegalInitialization()
o be cached,但使用new分配的资源怎么办? 如何在返回之前释放它们,我应该调用删除吗?
只是一个附带说明:我是这个领域的新手,所以有人可以检查一下上面的代码是否写得很好(性能方面的和理论上预期的一样)
假设您指的是throw
而不是return
(您不能从构造函数返回值!) 为了取消对象的创建,是的,您必须首先delete[]data
。
通常的方法是递归地应用“资源获取即初始化”模式。 也就是说,data
的类型不应该是原始指针,而应该是一些智能类型(如std::unique_ptr
),当它超出作用域时,它将自动执行删除操作。
(std::unique_ptr
又是内部异常安全的。)
如果您确实只是提前-return
ing,那么您就会遇到更大的问题--对象处于无用状态,而拥有对象的作用域却不知道它,并且使用return
参数会导致构建失败(因为,再次说明,您无法从构造函数返回值!)。