C++语法(智能指针)

Posted Foxradish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++语法(智能指针)相关的知识,希望对你有一定的参考价值。

C++语法(智能指针)

  1. \\(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;
    
  2. \\(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++语法(智能指针)的主要内容,如果未能解决你的问题,请参考以下文章

C++基础语法梳理:智能指针和强制类型转换运算符

C++原生指针,引用与智能指针

C++语法学习笔记

更新:C++ 指针片段

C++智能指针(3.30)

指向外部托管(例如:Python)资源的 C++ 智能指针?