C++语法(智能指针)
Posted Foxradish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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));
以上是关于C++语法(智能指针)的主要内容,如果未能解决你的问题,请参考以下文章