美文网首页C++程序员
两个指针的坑

两个指针的坑

作者: littlersmall | 来源:发表于2016-01-11 13:06 被阅读136次

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。

相关文章

  • 两个指针的坑

    1 这个坑是半年前遇到的,当时也是定位了半天。代码如下: 2 这个坑是昨天封装epoll遇到的,定位了昨天一晚上加...

  • 智能指针

    指针的危害 指针未初始化 野指针 内存泄漏 参考阅读C/C++指针使用常见的坑 智能指针分类 本质:将指针封装为类...

  • 坑收集(cpp)

    1、使用容器加智能指针的一个坑: 假设有两个容器声明如下: map > > earthMap; list > ...

  • LeetCode141. 环形链表

    原题链接 思路:快慢指针,两个指针首先同时指向头部,然后一个指针每次走两个,一个指针每次走一个,两个指针相遇之后,...

  • 滑动窗口算法

    一、滑动窗口算法 也会使用两个指针,但和双指针算法不同的是双指针算法关注的往往是两个指针正在指向的两个元素,而滑动...

  • 328. Odd Even Linked List

    就是两个指针,odd 和even的指针过程

  • 86. 分隔链表

    双指针法: 直觉我们可以用两个指针pbig 和 psmall 来追踪上述的两个链表。两个指针可以用于分别创建两个链...

  • C:函数指针的坑

    关于该死的函数指针和指针函数 先来个目录 常量指针、指针常量 数组指针、指针数组 函数指针、指针函数 1、先看第一...

  • [golang] for ... range指针的坑

    话不多说,看代码知道输出结果么? 输出结果 for range每次循环使用的是同一个临时变量!每次都是做了一次值拷...

  • 指针与引用的坑

网友评论

    本文标题:两个指针的坑

    本文链接:https://www.haomeiwen.com/subject/exwqkttx.html