【发布时间】:2013-11-23 02:43:14
【问题描述】:
这是我第一次尝试编写自定义异常类来实现简单形式的堆栈跟踪。
这是.h:
class error {
public:
error ();
error (const error & err);
~error ();
int level ();
private:
int _level;
};
这是.cpp:
error::error ()
: _level (0) {}
error::error (const error & err)
: _level (err._level) {}
error::~error () {}
int error::level () {
return ++_level;
}
然后我定义了两个宏,一个用于创建错误并在第一次抛出它(INIT_ERROR),另一个用于踢出捕获的错误(KICK_ERROR):
#define WHERE(stream) {fprintf (stream, " %-30s [%s: %3d]\n", __FUNCTION__, __FILE__, __LINE__);}
#define INIT_ERROR {fprintf (stderr, "# 0"); WHERE (stderr); throw error ();}
#define KICK_ERROR {fprintf (stderr, "# %2d", err.level ()); WHERE (stderr); throw;}
如你所愿,用法如下:
if (something wrong)
INIT_ERROR;
第一次,并且:
try {
// some code
}
catch (error & err) {
KICK_ERROR;
}
其他时间。
但是,DrMemory(我正在使用 Windows Xp)提醒我仍然可以访问的块:
ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
0 unique, 0 total uninitialized access(es)
0 unique, 0 total invalid heap argument(s)
0 unique, 0 total GDI usage error(s)
0 unique, 0 total warning(s)
0 unique, 0 total, 0 byte(s) of leak(s)
0 unique, 0 total, 0 byte(s) of possible leak(s)
3 unique, 3 total, 16 byte(s) of still-reachable allocation(s)
ERRORS IGNORED:
3 potential leak(s) (suspected false positives)
为了完整起见,这是主要的:
void fun3 () {
fprintf (stderr, "nothing special");
INIT_ERROR;
}
void fun2 () {
try {
fun3 ();
}
catch (error & err) {
KICK_ERROR;
}
}
void fun1 () {
try {
fun2 ();
}
catch (error & err) {
KICK_ERROR;
}
}
int main () {
try {
fun1 ();
}
catch (error & err) {
cerr << "error catched in main" << endl;
}
}
我的代码有问题吗? 有什么建议吗?
【问题讨论】:
-
您正在重新抛出
KICK_ERROR中的异常。如果您没有再次捕获它,这将导致std::terminate。坏坏东西。顺便说一句,你应该通过 const 引用来捕捉。 -
const,是的,但我仍然很高兴他完全被裁判抓住了......很多人都忘记了。 -
异常从头到尾被捕获。为了完整起见,我添加了主要内容。
-
不能使用 const。成员函数 level () 不是 const,因为它增加了 _level 属性。
-
@RichterBernadell 如果您标记字段
mutable,则可以。
标签: c++ exception memory-leaks