1 这个坑是半年前遇到的,当时也是定位了半天。
代码如下:
typedef struct A
{
    int a;
    int b;
    virtual void test() {}
    A() 
    {   
        memset(this, '\0', sizeof(*this));
    }   
} A;    
int main()
{
    A a;
    A* t = &a; 
    a.test();
    t->test();
}
2 这个坑是昨天封装epoll遇到的,定位了昨天一晚上加今天一上午。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
class A;
class C
{
    vector<A*> handle_;
    public:
    void add(A* a)
    {
        handle_.push_back(a);
    }
    void test();
};
class A
{
    protected:
    C* c_;
    public:
    A(C* cc) : c_(cc)
    {}
    virtual void test() = 0;
    void add()
    {
        c_->add(this);
    }
};
//为啥要定义在这里而不是紧跟 C ??
//呵呵,自己想
void C::test()
{
    for (unsigned int i = 0; i < handle_.size(); i++)
    {
        handle_[i]->test();
    }
}
class B : public A
{
    public:
    B(C* cc) : A(cc)
    {}
    void test()
    {
        cout << "hello\n";
    }
};
int main()
{   
    vector<B> test;
    C c;    
            
    for (int i = 0; i < 5; i++)
    {           
        B b(&c);    
                                
        test.push_back(b);          
        test.back().add();
    }               
    
    c.test();
}   
这两段代码都和指针有关,运行都会core。
这样的两个坑也大概可以说明c++到底有多复杂,精通c++到底有多难。同时也大概可以说明为啥站在程序设计顶峰的人大抵都是c或c++程序员。
这两段代码都无法通过core文件定位,换句话说,你gdb一步一步跟也不会有任何结果。
解:
1 vptr被赋为0了。
2 变量c和vector test对于当前程序不存在脱离作用域的问题,因此test.back().add()传入的this指针指向test的最后一个变量的地址,似乎并没有问题。但是,当元素插入第二次时,vector c需要扩容(引起存储的值的地址发生改变),这样将导致C中handle_里存储的A*指针失效,引起core。