Q_CHECK_PTR and “fscanf float or double”

来源:互联网 发布:战地1淘宝代购 编辑:程序博客网 时间:2024/04/30 07:11

在机房做实验,同学发短信过来问,段错误一般如何调试。这个问题有点问大了,我认为造成端错误一般都是指针问题,而且绝大多数情况为使用未初始化的指针,这并不是说使用值为NULL的指针,下面我遇到的就可以说明这点,其实大家都知道,只不过要知行合一,那还得有一番修炼才行。
中午回去后,调试发现如下出错的地方是在下面代码中的setRange出错,报的是SIGSEGV,段访问错误。

LCDRange *angle=new LCDRange();
Q_CHECK_PTR(angle);
angle->setRange(5,70);

以前没有用过Q_CHECK_PTR,但看到过,就在setRange前加上了,但还是到setRange才报同样错误,这儿显然Q_CHECK_PTR没有发挥到作用,而仔细查看文档知道,这个宏只是检查指针是否为NULL(C++里更偏向于说是否为0),而不是去检查是否为野指针或者说悬浮指针,当然我还没看到有能这方面能力的检查工具,其实也没有必要,堆上的内存管理是程序员的责任,Greater Power comes Greater Responsibility(记得自己当年参加惟一的一次竞选是说这句话的时候台下是一片哗然)。

int *a;

Q_CHECK_PTR(a = new int[80]); // WRONG!

a = new (nothrow) int[80]; // Right
Q_CHECK_PTR(a);

最后还是同学自己一行行比较找出来的,自己那个Qt里那个cannon例子谢了很久,发现过几处有问题,但当时并没有记录下来。

QSlider *slider=new QSlider(Qt::Horizontal);
slider->setRange(0,99);

上面两行是出现在 LCDRange的构造函数里,而下面这行是出现在LCDRange的setRange方法里,

slider->setRange(minValue,maxValue);

聪明的你很快就明白了问题之所在了吧。在构造函数里出现的代码并没有初始换slider,而是自己声明了一个局部变量,忙乎一阵,最后成员变量slider还是dangling pointer,其实这儿也涉及到C++语法:对于成员变量,如果未在构造函数初始换,那么值类型的成员将会赋值为个类型的默认值,而引用类型的值则为不确定。哎,我当时半天都没有看出来,只是傻啦吧唧地盯着Q_CHECK_PTR.

刚才同学问我C语言怎么读文件,让我写几行示例一下。我也正好闲着,那就写吧,可是在读写float型变量时总是出问题以前在TurboC下也是,以为VC6.0也是,最后才发现声明时为double,fprintf写的时候是用”%f”,fscanf读的时候也是用”%f”,自然出不来啊,得用”lf”啊,TurboC是真bug也.


和网页http://blog.schemacs.com/?p=687的作者无