“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。所以我们应该极力的去避免野指针的出现~今天ooxx研究院来给大家讨论下野指针

野指针的成因主要有三种:

一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

三、指针操作超越了变量的作用范围。

那我们应该如何避免野指针呢?

总的来说,ooxx研究院认为最好的方法就是写一点代码自己管理指针。GC之类的方法对性能的影响在很多时候不能低估。比如string的处理就没有谁是搞好了的,java的String奇慢,c++的string类其实也很慢,如果用了stringstream就慢得惊人了。写一点串处理的程序试验一下就能发现,这些东西的性能与纯C程序的串处理性能往往会差1个数量级以上。

所以说,过分依赖GC或者一些对象的包装方法来管理内存,并不见得十分有效。

如果用C写程序经常可以用这一类的方法来解决问题:
将程序布局为一些较大粒度的session,以session为内存管理单位,所有同一session中分配的内存,都不需要考虑释放,仅仅在session结束时一同释放。

事实上apache中的pool的代码就是这么实现的,写程序的时候参考参考很有好处。

另外象gnome的glib中的内存管理也采用了类似的方法,不过在内存的使用上显得更霸道一点,所有的内存都以chunk组织,分配的内存从来都不释放,只是还给了glib自己的内存池。

即便是C++的STL,在小内存管理上也类似glib采用了chunk的方法。

不要以为不释放不是好方法,事实上即便是malloc,对于分配的虚拟内存空间事实上也没有真正释放,malloc分配堆的时候,如果不够了都会使用sbrk系统调用,调整系统堆,但从来都不会往小了调。

这里的观点已经很明确了:
1.   自己管理内存。
2.   在程序逻辑上以较大粒度管理内存。
3.   如果做最简化的实现,上面两条要不了100行代码。