IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 智能指针 unique_ptr -> 正文阅读

[C++知识库]C++ 智能指针 unique_ptr

?一 unique_ptr概述


?? ?独占式的概念(专属所有权):同一个时刻,只能有一个unique_ptr指针指向这个对象(这块内存);
? ? 当这个unique_ptr被销毁的时候,它所指向的对象也被销毁;
?? ?格式;
?? ?unique_ptr<指向的对象类型> 智能指针变量名。


二 功能测试代码

#include <stdio.h>
#include <memory>
#include <iostream>
#include <functional> 
class A{
public:
    A(int a):ma(a)
    {
        std::cout << "demoA 构造  "<<"ma:"<<ma<< std::endl;
    }
    A()
    {
        ma=100;
        std::cout << "demoA 构造 "<<"ma:"<<ma<< std::endl;
    }

   void getA(){
        std::cout << "测试a: " << ma<<std::endl;
    }
   ~A()
   {
      std::cout<<"demoA 析构"<< "ma:"<<ma<<std::endl;
   }
  public:
    int ma;
};
void deleter(A * x)
{
    std::cout << "Custom Deleter\n";
    delete[] x;
}

unique_ptr<A> backTest()
{
    unique_ptr<A> A_ptr(new A(9));
    return A_ptr;
}

int main(int argc, char *argv[])
{
    unique_ptr<A> A_ptr(new A(0));
    A_ptr->getA();

    //move左值转右值
    unique_ptr<A> A_ptr1 = std::move(A_ptr);
    A_ptr1->getA(); 


    //get使用
    A * A_ptr3 = A_ptr1.get(); //p指向的对象,获取裸指针
    A_ptr3->getA();


    //release使用放弃对指针的控制权(切断了智能指针和其所指向的对象之间的联系)。
	//返回裸指针,将该智能指针置空。返回的这个裸指针我们可以手工delete来释放,也可以用来初始化另外一个智能指针,或者给另外一个智能指针赋值。
   //A_ptr1.release(); 会导致内存泄漏。
    A * A_ptr4  = A_ptr1.release();  
    delete A_ptr4;      //
    A_ptr4 = nullptr;


    //reset 使用
    std::cout<<"-----------"<<endl;
    unique_ptr<A> A_ptr5;  // empty
    A_ptr5.reset (new A(5));       // reset()带参数的情况:释放智能指针所指向的对象,并让该智能指针指向新对象
    A_ptr5->ma=5;
    A_ptr5->getA();
    A_ptr5.reset();               // 释放A_ptr5

    A_ptr5.reset (new A(6));       
    A_ptr5->ma=7;
    A_ptr5->getA();
    A_ptr5.reset();
    std::cout<<"-----------"<<endl;


    //=使用
    unique_ptr<A> A_ptr6;
    unique_ptr<A> A_ptr61(new A(8));
    A_ptr6=unique_ptr<A>(new A(8));    //合法
    A_ptr6=A_ptr61              //报错不能直接=
    //返回值
    A_ptr6=backTest();         //返回值为临时对象可以相等
    A_ptr6.reset();
    std::cout<<"-----------"<<endl;

    //删除器
    typedef void(*fp)(A *);//typedef定义函数指针
    unique_ptr<A,fp> A_ptr7(new A[5],deleter);
    A_ptr7.reset();
    std::cout<<"-----------"<<endl;
    using fp2=void(*)(A *);//using定义函数指针
    unique_ptr<A,fp2> A_ptr8(new A[5],deleter);
    A_ptr8.reset();
    std::cout<<"-----------"<<endl;
    typedef decltype(deleter)* fd3; //decltype返回数据类型为void(A*),所以定义函数指针需要加*
    unique_ptr<A,fd3> A_ptr9(new A[5],deleter);
    A_ptr9.reset();
    //lambad表达式
    std::cout<<"-----------"<<endl;
    auto Fdele=[](A* x){ std::cout << "Custom Deleter\n";delete[] x;};//lambad表达式,可以理解为一个带operate()的类对象
    unique_ptr<A,decltype(Fdele)> A_ptr10(new A[5],Fdele); //所以可以理解decltype(deleter)=class{...}
    A_ptr10.reset();
    std::cout<<"-----------"<<endl;
    unique_ptr<A,function<void(A*)>> A_ptr11(new A[5],[](A* x){ std::cout << "Custom Deleter\n";delete[] x;});//function 定义函数指针
    A_ptr11.reset();
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:09:20  更:2022-04-27 11:10:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 0:55:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码