【C语言】两个指针的坑
时间:01-13 11:02 阅读:838次
*温馨提示:点击图片可以放大观看高清大图
简介:这两段代码都和指针有关,运行都会core。这样的两个坑也大概可以说明c++到底有多复杂,精通c++到底有多难。同时也大概可以说明为啥站在程序设计顶峰的人大抵都是c或c++程序员。
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。