因此,我正在设计一个将处理大量内存的类,如果在构造函数的内存分配过程中出现问题,我想确保它正确展开。
这是我得到的:
class foo{
public:
foo(): var1(nullptr), var2(nullptr){
try{
var1 = new int(1);
var2 = new int(2);
}
catch(std::exception &e){
delete var1;
delete var2;
return;
}
//Some other things involving these variables
}
如果我只想停止构造该对象,而后由于bad_alloc异常而导致构造函数中的某些后续代码导致错误,那么我是否可以在catch块中返回该对象?还是catch块终止时才取消构造函数?我会使整个事情变得复杂吗?
最佳答案
您应该检出智能指针:std::unique_ptr
(在这种情况下将是有用的)和std::shared_ptr
/ std::weak_ptr
(对于您的示例而言,不是正确的类型,但很容易理解)。
只要您不重新实现某种智能指针,而使用它们代替动态分配,就可以为您省去一些麻烦(即使您的示例是正确的,并且在析构函数正确的情况下也不会泄漏)。
而不是返回,您应该引发异常:应该通知调用方构造失败(如果分配失败意味着构造函数失败)。 RAII表示该对象永远不能处于无效状态。
关于c++ - 在构造过程中抛出bad_alloc时如何实现正确的堆栈展开和raii,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44064194/