注意观察下面的代码,如果new出来的对象忘记被delete释放,是会发生内存泄漏的。
1 |
|
那么如何让使用指针不必有那么大的心智负担了?因为局部变量使用之后,程序会自动帮我调用其析构函数,因此我们要将指针变量的创建修改修改:
1 | //引入sp,其意为SmartPoint |
输出如下,可以看到我们并没有主动delete,程序就避免了内存泄漏。
1 | Person() |
接下来我们继续改进:
1 | sp(Person *other){ |
输出如下,程序发生了崩溃,因为两次进行delete p;
1 | Person() |
没事,遇事不要慌,东西都在后备箱,看我们的破解大法
1 | class Person{ |
Person只new了一个,因此也只析构了一次,程序正确:
1 | Person() |
程序似乎还不够优美,1. 引用计数写在Person里面的 2. 如果换一个类怎么办了?
- 引入RefBase基类用于计数
- 使用模板类实现任意对象的自定义只能指针
一切尽在不言中,上代码
1 | class RefBase{ |
输出
1 | RefBase |
那么到这里是否就结束了呢?No, 并没有,实际上这个代码是线程不安全的。Android源码中就有很好的例子,__sync_fetch_and_add就是确保线程安全。
1 | inline LightRefBase() : mCount(0) { } |