C++BUG汇总

某个函数的重载无效

有可能是函数没有写对,建议像其它语言一样,在派生类的重载函数后面写上override关键字,确保正确重载。如:

#include <iostream>

class A
{
public:
    virtual void func1(){std::cout << "A";}
};
class B : public A
{
public:
    void func2() override {std::cout << "B";}
};
int main()
{
  B* b = new B;
  A* a = b;
  a->func1();
}

上述代码中class B的重载函数不小心把func1()写成了func2(),由于有override关键字,在编译阶段就会报错。虽然没有override关键字也可以正确重载,但发生上述写错或后期修改了class A的func()之后会导致重载无效,从而出现不想要的结果。

某个库某函数运行多次时间明显不一致、不线性

该函数中有静态对象或单例对象,第一次用的时候创建多花了时间。

例如:1次执行时间为100ms,而2次执行时间为110ms,10次执行时间为192ms。那很可能第一次花90ms创建了一个东西。

位运算左移错误

for(int i=0; i < 64;i++)
{
    unsigned long long a = 1 << i;
    std::cout << a << std::endl;
}

上述代码用unsigned long long去存a,看起来没有任何问题,但问题就在于这个1默认就是int,即不是unsigned更不是long long。

类大小(sizeof)的影响因素

成员变量是最主要的,当然,要考虑一下对齐的问题。

我们知道静态变量和函数是不影响的。

但如果类有虚函数是有个虚函数表的,这个要占8个字节大小。这8个字节应该是表的地址,因此不管有几个虚函数都是8个字节。另外考虑到对齐的问题,大小至少是8个字节的部数。

没有类型检查导致的严重BUG

#include <iostream>
#include <bitset>
#include <functional>

const int n = 64;
std::hash<std::bitset<n>> hash_fn;
void func(std::bitset<n> a){std::cout << a.to_string() << std::endl;} 
int main()
{
  std::bitset<n> a(0x8888);
  auto hash = hash_fn(a);
  func(hash);// 这一行错把hash当参数放进去了,但居然能编过,并且没有运行时错误,造成了难及发现的bug
}

慎用减法

for(int i=0; i < 64;i++)
{
    unsigned long long a = 1 << i;
    std::cout << a << std::endl;
}
unsigned long long a = 10, b = 100;
for(unsigned long long i=0;i<1000;i++)
{
    if(i - a > b) // 0ull-10ull > 100ull
        break;
}

 

 

 

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

5 − 4 =