智能指针是为了解决什么问题?
https://blog.csdn.net/k346k346/article/details/81478223
以下是 unique_ptr 特有的操作:
- unique_ptr u1 unique_ptr<T, D> u2 定义两个 unique_ptr 空指针,它们可以指向类型为 T 的对象。u1 使用 delete 来释放指针,u2 使用类型为 D 的可调用对象进行释放;
- unique_ptr<T, D> u(d) 定义 unique_ptr 空指针,使用类型为 D 的可调用对象 d 进行对象释放;
- u = nullptr 删除 u 所指向的对象,并使其称为空指针(只接收 nullptr 类型);
- u.release() 交出 u 所指向对象的控制权,返回 p 所指向对象的内置指针,并使得 u 为空指针;
- u.reset() 删除 u 所指向的对象;
- u.reset(q) u.reset(nullptr) 删除 u 所指向的对象,并使得 u 指向内置指针所指向的对象,否则使得 u 为空指针;
以下是 shared_ptr 特有的操作:
- make_shared(args) 返回一个类型为 T 的动态对象的智能指针,使用 args 进行初始化对象;
- shared_ptrp(q) p 是 shared_ptr q 的拷贝,将增加 q 的引用计数,q 中指针必须可以转为 T*;
- p = q p 和 q 是指向可转换指针的智能指针 shared_ptr。减少 p 的引用计数,并增加 q 的引用计数,当 p 的引用计数为 0 时,删除其所指向的动态对象的内存;
- p.unique() 当 p 的引用计数是 1 时,返回 true,否则返回 false;
- p.use_count() 返回 p 所指向对象的引用计数,可能是一个很慢的操作,主要用于调试目的;
以下是 weak_ptr 的常用操作:
- weak_ptr w 创建 weak_ptr 的空指针,其指向 T 类型对象;
- weak_ptr w(sp) 创建指向与 shared_ptr sp 所指向相同对象的 weak_ptr ,T 必须与 sp 所指向对象的类型可以相互转换;
- w = p p 可以是 shared_ptr 或者 weak_ptr ,赋值后 w 指向与 p 一样的对象;
- w.reset() 使得 w 为空指针;
- w.use_count() 返回指向同一个对象的 shared_ptr 的个数;
- w.expired() 如果没有 shared_ptr 指向对象时返回 true&#