1 這個坑是半年前遇到的竹习,當(dāng)時也是定位了半天指孤。
代碼如下:
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();
}
這兩段代碼都和指針有關(guān)锁荔,運行都會core蟀给。
這樣的兩個坑也大概可以說明c++到底有多復(fù)雜,精通c++到底有多難阳堕。同時也大概可以說明為啥站在程序設(shè)計頂峰的人大抵都是c或c++程序員跋理。
這兩段代碼都無法通過core文件定位,換句話說恬总,你gdb一步一步跟也不會有任何結(jié)果前普。
解:
1 vptr被賦為0了。
2 變量c和vector test對于當(dāng)前程序不存在脫離作用域的問題壹堰,因此test.back().add()傳入的this指針指向test的最后一個變量的地址拭卿,似乎并沒有問題骡湖。但是,當(dāng)元素插入第二次時记劈,vector c需要擴容(引起存儲的值的地址發(fā)生改變)勺鸦,這樣將導(dǎo)致C中handle_里存儲的A*指針失效并巍,引起core目木。