【C语言】两个指针的坑

来源:本站
导读:目前正在解读《【C语言】两个指针的坑》的相关信息,《【C语言】两个指针的坑》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《【C语言】两个指针的坑》的详细说明。
简介:这两段代码都和指针有关,运行都会core。这样的两个坑也大概可以说明c++到底有多复杂,精通c++到底有多难。同时也大概可以说明为啥站在程序设计顶峰的人大抵都是c或c++程序员。

1 这个坑是半年前遇到的,当时也是定位了半天。 代码如下:

typedef struct A{    int a;    int b;    virtual void test() {}    A()     {           memset(this, '', 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 << "hellon";    }};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。

提醒:《【C语言】两个指针的坑》最后刷新时间 2024-03-14 00:58:46,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《【C语言】两个指针的坑》该内容的真实性请自行鉴别。