COPY了Rumination On c++中的一段句柄类生成树形表达式的程序,第一次匆匆的修正运行后隔了一段时间在第二次重新修正时仍然困难重重,这才了解以前没有真确的掌握调试的一些技巧,做个学习总结。
源代码部分如下:
Driver.cpp 驱动函数
Expr.h 头文件,包含有两个类?:句柄类Expr,为了获得公共接口而设计的类Expr_node
class Expr_node{
friend ostream& operator<<(ostream&, const Expr&); friend class Expr;
//
}
class Expr
{ friend ostream& operator<<(ostream&, const Expr&);
Expr_node* p;
//
}
VC中编译时遇到的看似比较棘手的一个问题是:
error C2679: binary ‘<<‘
然后我到linux平台下换个环境进行编译(只编译,不链接,可以将编译阶段的错误暴露出来),看看是否有什么不一样的编译错误会报错来:
g++ -c Driver.cpp
果然有不一样的提示:
ISO C++ forbids declaration of ‘ostream’ with no type
这样的提示比error C2679要明显的多(虽然都是指向同一个错误原因)。这样很容易修正bug
在Expr.h的声明中添加:
using std::ostream;
到这里只是本演示修正的第一步:)
再次运行g++ -c Driver.cpp,得到编译后的链接文件Driver.o
此时进行链接, g++ -o Driver Driver.o
得到默认可执行文件Driver
但是运行Driver,gcc提示
segment error.
怎么知道是什么样的段错误引发了呢?
这是就用到了gdb
gdb ./Driver
//
gdb run
至此错误信息已经被定位出来了,是
~Expr::Expr()
系统给programmer的提示是段错误是由于析构函数的错误书写引发的,这样就很容易进行修改了。
修正至此算是告一段落了。
人总是珍惜未得到的,而遗忘了所拥有的