【发布时间】:2011-03-11 23:55:12
【问题描述】:
今天早些时候,我发现了函数 try-catch 块(实际上来自 here),然后进行了一些研究——显然它们的主要用途是捕获构造函数初始化列表中抛出的异常。
无论如何,这让我想到了失败的构造函数,我已经到了一个我只需要一点澄清的阶段。这只是我试图更多地了解该语言,所以我没有实用示例,但这里有......
鉴于此示例代码:
class A
{
private:
B b
C *c; //classes B, C & D omitted for brevity as not really relevant
D d;
public
A(int x, int y, int z)
};
A::A(int x, int y, int z)
try
: b( x )
, c( new C(y) )
, d( z )
{
//omitted
}
catch(...)
{
//omitted
}
在这些情况下会发生什么:
-
b的初始化引发异常。 -
c的初始化引发异常。 -
d的初始化引发异常。
具体来说,我至少想知道:
- 什么会/可能导致
new C(y)的内存泄漏。 我想只有 3 个? (见here) - 你可以
delete b吗? 情况 1 和 2 有危险吗?
显然,我想最安全的做法是让c 成为智能指针。但暂时不考虑这个选项,最好的行动方案是什么?
在初始化程序中将c 设置为NULL,然后在构造函数主体中调用new 是否安全?
这意味着delete c 必须放在catch 中,以防在构造函数主体中抛出其他东西?这样做是否存在安全问题(即,如果是 c = new C(y); 本身抛出)?
【问题讨论】:
-
您不能依赖将 c 设置为 NULL,因为如果 b 抛出异常,此时 c 将不会被设置为 NULL。正如你所说,使用智能指针。
-
@5ound - 我没想到的非常好点。
标签: c++ exception constructor