C++语法(智能指针)
C++语法(智能指针)
-
\(unique\_ptr\)
\(unique\_ptr\) 实现独占式拥有或严格拥有概念, 保证同一时间内只有一个智能指针可以指向该对象. 它对于避免资源泄漏(例如" 以new 创建对象后因为发生异常而忘记调用delete") 特别有用
采取的所有权模式, 下面是例子
unique_ptr<string>p3(new string("auto")); unique_ptr<string>p4; p4 = p3; // 此时会报错 编译器认为\(p4 = p3\) 非法, 避免了 \(p3\) 不再指向有效数据的问题. 因此\(unique\_ptr\) 更安全
另外 \(unique_ptr\) 还有一个更聪明的地方: 当程序试图将一个 \(unique\_ptr\) 赋值给另一个时, 如果源 \(unique\_ptr\) 是个临时的右值, 编译器允许这么做; 如果源 \(unique\_ptr\) 将存在一段时间, 编辑器将禁止这么做, 比如:
unique_ptr<string> pu1(new string ("hello world")) unique_ptr<string> pu2; pu2 = pu1; //#1 会报错 unique_ptr<string>pu3; pu3 = unique_ptr<string>(new string("You")); //#2 allowed 其中#1 留下悬挂的 \(unique\_ptr(pu1)\) , 这可能导致危害. 而#2 不会留下悬挂的 \(unique\_ptr\) 因为它调用\(unique\_ptr\) 的构造函数, 该构造函数创建临时对象在其所有权转让给\(pu3\) 后就会销毁, 这种随情况而己的行为表明 \(unique\_ptr\) 优于 \(auto\_ptr\)
注: 如果确实想执行类似于#1 的操作, 要安全的重用这种指针, 可以给它赋新值. \(C++\) 中已有一个标准库函数 \(std::move()\) , 让你能够将一个 \(unique\_ptr\) 赋给另一个. 例如:
unique_ptr<string> ps1, ps2; ps1 = demo("hello"); ps2 = move(ps1); ps1 = demo("axxxx"); cout<< *ps1<<*ps2<<endl; -
\(shared\_ptr\)
\(shared\_ptr\) 实现共享式拥有概念, 多个智能指针可以指向相同对象, 该对象和其他相关资源会在"最后一个引用被销毁" 时释放. 从名字 \(share\) 可以看出来资源可以被多个指针共享, 它使用计数机制来表明资源被几个指针共享, 可以通过成员函数 \(use\_count()\) 来查看资源的所有者个数. 除了可以 通过 \(new\) 来构造, 还可以通过传入\(auto\_ptr, unique\_ptr, weak\_ptr\) 来构造. 当我们调用 \(release()\) 时 当前指针会释放资源所有权, 计数减一. 当计数等于0 时, 资源会被释放.
\(shared\_ptr\) 是为了解决 \(auto\_ptr\) 在对象所有权上的局限性\((auto\_ptr 是独占的)\) , 在使用引用计数的机制上提供了可以共享所有权的智能指针
成员函数
\(use\_count\) 返回引用计数的个数
\(unique\) 返回是否独占所有权 \((use\_count 为1)\)
\(swap\) 交换两个 \(shared\_ptr\) 对象 (即交换所拥有的对象)
\(reset\) 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数减少
\(get\) 返回内部对象(指针), 由于已经重载了 () 方法, 因此对使用对象是一样的, 如
shared_ptr<int> sp(new int(1));

浙公网安备 33010602011771号