两个指针的坑

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容