C++这门复杂而灵活的语言不同于其他很多语言诸如Java,需要编程者通过new/delete来动态管理内存,这一不留神就容易造成内存泄漏,严重影响程序的健壮性。
C++可能的内存问题:
1.缓冲区溢出(buffer overrun)
2.空悬指针/野指针
3.重复释放(double delete)
4.内存泄漏(memory leak)
5.不配对的new[]/delete
6.内存碎片(memory fragmentation)
正确使用智能指针可以轻易解决前面的5个问题
1.缓冲区溢出:用std::vector<char> / std::string 或自己编写Buffer class来管理缓冲区,自动记住用缓冲区的长度,并通过成员函数而不是裸指
针来修改缓冲区。
2.空悬指针/野指针:用shared_ptr/weak_ptr
3.重复释放:用scoped_ptr,只在对象析构的时候释放一次。
4.内存泄漏:用scoped_ptr,对象析构的时候自动释放内存。
5.不配对的new[]/delete:把new[]统统替换为std::vector/scoped_array。
shared_ptr作为一种智能指针,原理很简单,它的作用跟指针一样,不过shared_ptr保存了一个引用计数,记录了有多少个shared_ptr共同指向同一对象。每当有新的shared_ptr指向该对象时计数加一,如果指向对象的shared_ptr销毁时计数减一,一旦对象的引用计数变成0,这个对象自动被销毁,这样对内存泄漏的控制很有帮助。
下面是shared_ptr的简单实现,通过