hprInCesium - 在cesium中实现HPR

记野指针带来的堆错误

错误流程:

结构体里面有指针,
结构体的vector整个赋值给了别人,
然后自己的直接clear了,
然后vector的clear()会释放指针的内存,但是却不会将指针置空
再去访问时就出错

简单错误再现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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操作;