C++里可能出现的内存问题大致有这么几个方面:
1、缓冲区溢出
2、空悬指针/野指针
3、重复释放
4、内存泄漏
5、不配对的new[]/delete
6、内存碎片
正确使用智能指针能很容易地解决前面5个问题。
1、缓冲区溢出:用vector<char>/string或自己编写Buffer class来管理缓冲区,自动记住已使用缓冲区的长度,并通过成员函数而不是裸指针来修改缓冲区
2、空悬指针/野指针:智能指针就是来解决指针问题的
3、重复释放:scoped_ptr,引用计数为0时才释放对象
4、内存泄漏:同样用scoped_ptr,对象析构时自动释放,无需delete
5、不配对的new[]/delete:把new[]统统替换为vector/scoped_array(用类或者智能指针之类的方式自动管理内存)。
现在的C++程序中最好不要出现delete语句,资源(包括复杂对象本身)最好都通过专门的对象(智能指针或容器)来管理,程序员不需要管理内存,就可以最大可能避免内存问题。
对于智能指针的使用场景,一般只有以下几种:栈上对象、其他对象的直接数据成员或是标准库容器里的元素,而不应该出现动态开辟的情形。
shared_ptr<Foo>* pFoo = new shared_ptr<Foo>(new Foo);
还要注意,如果智能指针时对象的数据成员,而它的模板参数是incomplete类型,那么对象的析构函数不能是默认或内联的,必须在.cpp文件里显示定义,否则会有编译错误或者运行错误。