目前为此遇到的极难的bug及解决办法

一、VC++(没有特殊说明,均为VS2008,VC++9.0)。

1.编译器总是提示xtree文件中缺少一个定义。原因为命名空间没有结束的大括号。

2.在为easyDDA添加实时显示功能时,出现主窗口无图像且软件反应极慢的问题。原因为要显示的这幅图像中有几个数据未定义,使用的三维引擎openInventor。

3.QWidget 只能设置一个layout,并且设置之后,不能再设置其他的。

4.在使用cmake配置vs2010的项目时,出现类似“${VS2010}/VC/bin/cl.exe" is not able to compile a simple test program.”。解决办法:找到这个文件,设置为“以管理员身份运行”。


二、g++

1.出现 类似“/usr/include/c++/4.8/ext/alloc_traits.h:199: error: no type named 'pointer' in 'class KBT_Tools::BaseVec<double, 3>'
     typedef typename _Alloc::pointer                pointer;"的错误。这是在linux下编译时出现的。g++的编译提示不如VC++,我出这个错误是因为把应该用std::map的地方用上std::vector.  在g++上出现错误,不能按vc++的习惯,在出错误那一行开始找解决办法,而要这个错误看不懂,看下一个错误,总有一个错误是能看懂的,这时就能解决问题。


2.在switch语句的case分支中新建对象时出现莫名其妙的错误。解决办法:把这一case分支用大括号括起来。

3.遇到类似 “error: undefined reference to `typeinfo for”的错误(使用g++编译)。某个类有virtual函数,但是没有定义对应的virtual虚函数。

4.使用模板类时,出现'undefined reference to void A<T,T1>::abc()'的错误。模板类在使用时会生成对应的新类,如vector<int>会在使用时生成一个新的vector类,其中的T替换为int。所以模板类的所有内容要在include时访问得到。   解决办法:将模板类cpp文件内的内容剪切到对应的.h文件内。

5.编译时出现‘undefined reference to vtable for "A::A"’,上网google了很久,都没有解决问题。最后仔细检查发现,这个类A有一个虚函数,我声明了但是没有定义。(这个提示真是。。。)

6.   C++ 里面使用goto进行跳转的时候,如果使用不当,会出现“jump to label crosses initialization of...”这样的错误,出错的原因在于,某些类在未初始化的时候就程序就使用了goto,(换句话说,有些类是在goto语句出现之后才进行的初始化(执行构造函数)),这是不允许的。
     解决办法:确认将必需的类初始化动作放到goto出现之前。(这里指的是类,不是普通的变量)

7.遇到类似“error: need ‘typename’ before ‘std::list<T>::iterator it ...”的错误,编译器没有识别出std::list<T>::iterator视作一个类型,所以这时需要告诉编译器。解决办法:按编译器说的,加个typename,变成 ”typename std::list<T>::iterator it ...“   。

8.今天修改了qt的ui文件,把其中的qdoublespinbox的上下限设成了允许的最大值。结果软件的其他地方出了问题(具体表现为看不到显示的osg场景结点)。 汗。。。     之后把上下限设成了(-9999999~9999999)才正常。

9.比对两段代码结果,会多次写入。自己计算正确,但比对文件结果总是错。调试了很久,最后在每次输出的时候加上编号,发现输出的编号是倒序10的,仔细检查发现是因为文件指针开了没有关,导致结果后输出到文件由于回收资源先反而先写入了。。。

10.写代码时遇到bug

error: 'iterator_traits' in namespace 'ABC::boost::detail' does not name a type
error出现5000多个,检查了好一阵,发现原因在于写模块类时,

.h文件
namespace ABC
{
template <class T>
class A
{...};

#include "A.txx"
}

.txx文件
#include <boost/exception/all.hpp>   //这是在namespace ABC内include了boost文件
//定义模板类A的内容...

11.QT的信号和槽连接不上

有namespace ABC下的类sig,又有namespace BCD下的类A和B。连接类A的信号和B的槽。因为信号和槽在声明时参数列表都写的const ABC::Sig*。而我在connect时没有加命名空间ABC,导致无论如何也连不上。。。

解决办法:在connect时,给参数列表添加上命名空间ABC后一切正常。



clang (Mac平台下)

1.写了两个类关系,及调用如下:

class A   //配合智能指针使用的计数基数
{};
class B: public A
{
virtual ~B();//类B的子类会有多态(使用virtual函数)特性
};

void f()
{
SmartPointer<B> b = new B;  //SmartPointer<T>为实现的智能指针类
}
编译没有问题,运行时,总提示我,pointer being deleted was not allocated。我检查了好久,最后发现,类A的虚构函数没有明确声明是虚的。。。,而我在A中判断计数为0的情况下,调用了delete this,这就出了这个错误。

这就是《Effective C++改善程序与设计的55个具体做法》(第3版)第4条款,写计数类就竟没想起来后面会有虚函数。汗。。。

2.类成员变量(std::string和std::vector等,非指针)调用时出错,运行时错误大致意思是使用被free的对象。

起初考虑成员变量占内存大导致溢出的问题,但这个对象很小。重新确定方向后,经过详细的debug发现,确实有被free的内容,但不是出错的这个变量,而是另一个变量。

这种问题与编译器有关。有的编译器会将类的成员变量包在一起,处理时方便。这是这个错误的原因所在。调用没出错变量时触及了另一个被free的变量。

3.一个完全没有头绪的bug内容如下:

/usr/local/include/boost/atomic/detail/storage_type.hpp:116:13: error: no type named 'uint128_type' in namespace 'ABC::boost'; did you mean '::boost::uint128_type'?
    typedef boost::uint128_type type;
            ^~~~~~~~~~~~~~~~~~~
            ::boost::uint128_type
经过详细检查,竟然是写宏时少了一个换行。。。

如下:

namespace XXX{
#define BCD(p)\
       (p)*(p)\
}          // 这行前必须还要有一个空行!!!






你可能感兴趣的:(C++,debug,bug)