Raw pointer的缺点:
1、从原生的指针的声明中,不能得知这个指针是指向单个对象还是指向对象数组;
2、不知道是否应该销毁它,当你使用完之后;
3、不知道怎么销毁;
4、delete or delete[]?
5、不能确保程序的每个流程里都调用了delete或delete[],比如在异常发生的时候。这会导致内存泄漏;
6、无法判断raw pointer是否是dangle(悬挂指针)。
在C++11里有4个智能指针:
std::auto_ptr: deprecated
std::unique_ptr: 用来代替std::auto_ptr
std::shared_ptr:使用引用计数的资源控制方法
std::weak_ptr:配合std::shared_ptr,可以用来判断指针是否dangle。
std::unique_ptr:用std::unique_ptr管理独占的资源,通常用来做工厂方法的返回类型
std::shared_ptr:内含2个指针,一个指向对象,一个指向control block
auto pw = new Widget;
std::shared_ptr<Widget> spw1(pw, loggingDel);
std::shared_ptr<Widget> spw2(pw, loggingDel);
上面的3行代码是典型的误用,会导致pw被delete两次,产生undefined行为。
std::enable_shared_from_this
shared_from_this()
std::weak_ptr:control block里有weak ref count