由于指针delete导致的double free()问题
最近在项目中发现的一个问题,握手的时候类的初始化,初始化的时候有一个指针的赋值操作,类似于
this->client = p_client;
//这里client 和p_client都是指针
在挥手的时候会将这些类删除,在类的析构函数里,原来的代码执行了delete this->client操作,这是错误的。只有当执行new的时候,才需要执行delete操作,(之前我以为是指针就需要进行delete操作),这时对象是分配在堆上的。而通过赋值进行初始化的指针,是分配在栈上的。当不需要这个指针的时候,只需要赋值为NULL即可。当执行delete this->client时候,这时其实是执行的其指向的对象的析构。用代码进行说明:
class Person
public:
Person(int a):age(a){ cout << "default constructor" << endl; }
~Person() { cout << "deconstructor address:" << this << endl;}
int age;
int main(){
Person *p = new Person(2);
Person *p1 = p;
cout << "p" << p << endl;
cout << "p1" << p1 << endl;
cout << "&p" << &p << endl;
cout << "&p1" << &p1 << endl;
delete p1;
getchar();
default constructor
p012BFFA0
p1012BFFA0
&p00F9F86C
&p100F9F860
deconstructor address:012BFFA0
可以发现,当执行delete p1时,调用了p指向的对象的析构,此时p和p1都为悬空指针,访问他们的数据都是不合理的,所以在将对象delete之后,及时的将其赋值为null是很重要的。如果在delete p1之后,在delete p,就会导致double free,因为指向的内存已经释放。
int main(){
Person *p = new Person(2);
Person *p1 = p;
cout << "p" << p << endl;
cout << "p1" << p1 << endl;
cout << "&p" << &p << endl;