实现 smart_ptr
智能指针会自动地管理内存(释放不需要的内存),而不需要程序员去操心。 它能避免迷途指针(dangling pointers),内存泄漏(memory
leaks), 分配失败等情况的发生。智能指针需要为所有实例维护一个引用计数, 这样才能在恰当的时刻(引用计数为0时)将内存释放。
Tips:多个指针都指向同一块内存(存储 引用计数)
以实现同步引用计数,so,引用计数要用指针
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
上述代码有一点值得注意一下,《Cracking the Coding
Interview》在赋值函数中,
并没有检查原指针的引用计数是否已经减为0,然后去释放原指针所指向的内存。
也就是原书的代码有可能导致内存泄漏。正确的做法应该是在把指针指向新的地址前, 将原来指向的引用计数减1,如果为0,说明这个指针在指向新的地址后,
原来指向的内存将不再有指针指向它。那么我们就要把它释放, 否则内存就会在你眼皮底下泄漏的哦。
上述代码main函数中,sp2 =
spa这一句如果注释掉,我们得到的输出是:
destructor clear
destructor clear
说明内存的清理都是在main函数退出调用析构函数时。如果我们没有注释掉那行代码,
输出是:
operator= clear
destructor clear
说明当sp2指向新的内存后,原来的内存由于没有指针指向它而被释放掉。
另一块内存则是在main函数退出时释放的。
如果像CTCI书上所写,当sp2 =
spa这一句没有注释掉时,输出是:
destructor clear
也就是只释放了一块内存(ip1指向的内存),另一块由于没有指针指向它,
而又不及时清理,结果泄漏了。
转载:
作者:Hawstein
出处:http://hawstein.com/posts/13.9.html
声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative
Commons BY-NC-ND 3.0 ,转载请注明作者及出处。