提问者:小点点

C++返回异常,是否应该释放资源?


我为我的构造函数编写了以下实现:

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分配的资源怎么办? 如何在返回之前释放它们,我应该调用删除吗?

只是一个附带说明:我是这个领域的新手,所以有人可以检查一下上面的代码是否写得很好(性能方面的和理论上预期的一样)


共1个答案

匿名用户

假设您指的是throw而不是return(您不能从构造函数返回值!) 为了取消对象的创建,是的,您必须首先delete[]data

通常的方法是递归地应用“资源获取即初始化”模式。 也就是说,data的类型不应该是原始指针,而应该是一些智能类型(如std::unique_ptr),当它超出作用域时,它将自动执行删除操作。

(std::unique_ptr又是内部异常安全的。)

如果您确实只是提前-returning,那么您就会遇到更大的问题--对象处于无用状态,而拥有对象的作用域却不知道它,并且使用return参数会导致构建失败(因为,再次说明,您无法从构造函数返回值!)。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|返回|异常|释放|资源)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?