C++ 在C+;中不封装的情况下从构造函数引发异常的正确方法+;?

C++ 在C+;中不封装的情况下从构造函数引发异常的正确方法+;?,c++,exception,constructor,memory-leaks,C++,Exception,Constructor,Memory Leaks,关于StackOverflow,已经有几个问题了,但是没有一个问题能够充分说明从构造函数抛出异常的性质以及在某些情况下这样做的内存含义 我想问的是在构造过程中抛出异常的内存安全性,假设我们在构造过程中有几个分配对象 据我所知(我们所学到的)是,如果构造函数抛出异常,那么析构函数就不能保证被调用,因此对象可能处于不一致的状态。不确定我是否正确地解释了这一点 因此,如果我们在一个更复杂的构造函数中有像deques向量这样的对象(假设我们没有使用Init()方法,这样我们就不会违反RAII),这是否意

关于StackOverflow,已经有几个问题了,但是没有一个问题能够充分说明从构造函数抛出异常的性质以及在某些情况下这样做的内存含义

我想问的是在构造过程中抛出异常的内存安全性,假设我们在构造过程中有几个分配对象

据我所知(我们所学到的)是,如果构造函数抛出异常,那么析构函数就不能保证被调用,因此对象可能处于不一致的状态。不确定我是否正确地解释了这一点

因此,如果我们在一个更复杂的构造函数中有像deques向量这样的对象(假设我们没有使用Init()方法,这样我们就不会违反RAII),这是否意味着它们的内存不会被释放?。。还是因为它们在构造函数的作用域内而被破坏

另一种观点是,如果我们有一个deque作为类的私有变量,并且在构建过程中向它添加项,那么它就会失败。由于此deque是在初始化期间生成的,这是否意味着在对象构造期间引发异常时它不会被破坏/释放,从而导致潜在的泄漏

这都是假设我们没有使用单独的类来封装抛出类,捕获异常并单独处理它们


在构建过程中抛出异常的最安全的方法是什么?我们是否应该在抛出之前手动调用析构函数,以防出现手动内存分配之类的情况?

这有帮助吗?是的,但它仍然没有弄清楚这样一个事实:如果我们在构建过程中将项目推入其中,那么对于这样一个deque的对象会发生什么,然后它就没有完成。它必须已经被构造,否则对象就不能被推到它里面,所以据我所知,它不会得到freedFirst,如果你从构造函数中抛出一个异常,就没有对象,所以它不意味着谈论对象的状态。其次,在引发异常的点构造的所有子对象都将被销毁。这是语言定义所要求的,这取决于编译器是否正确。那么,在何种情况下,我们必须担心析构函数不会被调用,因为如果引发异常,析构函数不会被调用?@JackAvante:当然,副作用(例如,添加到现有容器)不会被自动重绕。使用范围保护来处理这个问题,或者只是在构造函数中避免这种副作用(通常应该避免影响其他对象)。这有帮助吗?是的,但它仍然没有弄清楚这样一个事实:如果我们在构建过程中将项目推入其中,那么对于这样一个deque的对象会发生什么,然后它就没有完成。它必须已经被构造,否则对象就不能被推到它里面,所以据我所知,它不会得到freedFirst,如果你从构造函数中抛出一个异常,就没有对象,所以它不意味着谈论对象的状态。其次,在引发异常的点构造的所有子对象都将被销毁。这是语言定义所要求的,这取决于编译器是否正确。那么,在何种情况下,我们必须担心析构函数不会被调用,因为如果引发异常,析构函数不会被调用?@JackAvante:当然,副作用(例如,添加到现有容器)不会被自动重绕。使用范围保护来处理这个问题,或者只是在构造函数中避免这种副作用(通常应该避免影响其他对象)。