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。