【发布时间】:2012-11-30 02:21:54
【问题描述】:
我已经阅读了 Michael Burr 关于引发异常的构造函数的精彩总结,这里:Will the below code cause memory leak in c++
我的问题是:从构造函数调用的函数引发异常时的行为是否相似?即,如果异常没有在抛出的地方被捕获,因此它会爬到构造函数并进一步爬到调用构造函数的函数。
我特别想知道该对象的类中包含的成员对象是什么,它们的析构函数会被调用吗?更具体地说,在我的例子中,它是关于 boost::shared_ptr 类型的成员。
考虑以下示例:
class A {
A() { throw some_exception }
};
class B {
B() { A a = new A(); }
};
class C {
boost::shared_ptr<B> p2b;
int i;
int *pint;
someclass objsomeclass;
someclass* psomeclass;
public:
C() {
objsomeclass = someclass();
psomeclass = new someclass();
pint = new int();
p2b(new B);
}
};
void foo()
{
C c();
}
main()
{
foo();
}
p2a 的析构函数会被调用吗? 如果您能指出一个涵盖此案例的适当且可靠的资源,我将不胜感激。
【问题讨论】:
-
格式化:不要使用制表符。关于代码:B 应该从 A 派生吗?否则 p2a 初始化似乎没有意义。
-
如果你的意思是它没有意义,因为 B 除了初始化 A 什么都不做,那只是为了举例。
-
p2a(new B)只有在B*可转换为A*时才能编译 ...但在您的代码中,它不是。此外,B::B无论如何都会泄漏A的一个实例。 -
@Useless,B::B 不会泄漏 A 的实例,因为 A 为其构造函数抛出了异常,因此从未创建 A a。请参阅我帖子上的链接。我错了吗?
-
没错,
A只有在没有抛出异常的情况下才会被泄露……但这意味着B的构造函数(如所写)只有在它从未成功的情况下才能正确。
标签: c++ exception constructor shared-ptr