【发布时间】:2013-03-11 04:41:45
【问题描述】:
ScreenShot #1: Sample(Sample&) {...) // 不使用“const”没有错误 ScreenShot #2:当不包含复制构造函数时,析构函数被调用了两次。
当我在 VC++2010 中运行这段代码时,我发现结果令人惊讶,请看一下:
#include <iostream>
using namespace std;
class Sample {
public:
Sample() { cout<<"Sample().\n"; }
// Sample (Sample&) { cout<<"Sample(Sample&).\n"; }
~Sample() { cout<<"~Sample().\n"; }
};
void fx() {
throw Sample();
}
int _tmain(int argc, _TCHAR* argv[])
{
try { fx(); }
catch (Sample&) { cout<<"Caught Sample.\n"; }
return 0;
}
请说明为什么在示例中不包含复制构造函数,析构函数被调用了两次。例如,如果我们在析构函数中释放堆,则这样做会导致 Abort()。
我也知道对象的副本是由抛出对象创建的,但为什么它不为此调用复制构造函数。
有关代码和输出,请参阅随附的屏幕截图。
【问题讨论】:
-
首先,应该是
class Sample {而不是class Sample() {。 -
另外,复制构造函数应该采用 const 引用,否则会出现编译器错误。
-
你能告诉我们你的真实代码吗?当我编译并运行它时,我只看到
Sample() - Caught_Sample - ~Sample -。 (有和没有复制构造函数) -
您的代码正在运行并确认 Xymotech 所说的内容:ideone.com/oe1uDF
-
@ajay:查看析构函数打印的内容,并将其与输出进行比较。 程序员要有敏锐的眼光!
标签: c++ visual-c++ exception-handling constructor