【发布时间】:2020-06-13 13:22:53
【问题描述】:
我为我的构造函数编写了以下实现:
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 被缓存,但是我使用 new 分配的资源呢?在返回之前如何释放它们,我应该调用删除吗?
只是一个旁注:我是这个领域的新手,所以有人可以检查上面的代码是否写得很好(性能方面并且在理论上按预期工作)
【问题讨论】:
-
这方面有什么帮助吗?
-
你为什么允许
Dimensions保留负值?既然行数和列数不会是负数,为什么不用unsigned类型来表示呢?无论哪种方式,如果给定非正维度,为什么不让Dimensions类型抛出异常?这样,Matrix可以安全地假设尺寸是有效的(因为在Matrix甚至构造之前会引发异常。 -
至于
delete []对应的new []是否被执行——这取决于。如果data是一个带有析构函数的类型,它在它接收到的指针上执行相应的delete [],那么所有的都将被清除。但是,如果data是其他任何东西(例如原始指针),则不会释放内存。推测Matrix的析构函数会进行这样的清理,但是在Matrix的构造函数主体中抛出异常时,Matrix的析构函数不会被调用。 -
如何从构造函数返回值?你的意思是
throw吗? -
@Peter 数据可以是字符串、整数、双精度或自定义类
标签: c++ class generics exception methods