记野指针带来的堆错误
错误流程:
结构体里面有指针,
结构体的vector整个赋值给了别人,
然后自己的直接clear了,
然后vector的clear()会释放指针的内存,但是却不会将指针置空
再去访问时就出错
简单错误再现
#include <iostream>
class A {
public:
A() {
ptr = new char[3];
}
inline void Release() {
if (ptr != nullptr) {
// std::cout << "ptr is: " << ptr << std::endl;
delete ptr;
ptr = nullptr;
}
std::cout << "call des" << std::endl;
}
~A() {
Release();
}
char* ptr;
};
int main() {
A tmp = A();
A tmp2 = tmp; // 这里将数据传递给tmp2,tmp我们不需要了,但是不能执行tmp的释放,因为tmp里面的数据我们任然需要
// tmp.ptr = nullptr; // 取消这句的注释,可以解决该bug
tmp2.ptr[0] = '1';
tmp2.ptr[1] = '1';
tmp2.ptr[2] = '1';
tmp.Release();
return 0;
// in fact, when ready to exit the main, will automatically call the tmp2's destructor
}
Tips:
- 1 如果你决定把一个对象以及它所指向的内存的所有权(读写,销毁的权利)交给另一个对象,赋值完以后务必立马将原来的对象置空,应当把这一过程看成是对原来的对象的delete操作;