unique_ptr智能指针
一、VS例子
// Test.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <thread>
#include <memory>
#include <iostream>
#include <assert.h> class A
{
public:
A()
{
std::cout << "A Create" << std::endl;
}
~A()
{
std::cout << "A Destroy" << std::endl;
}
void fun()
{
std::cout << "A Fun" << std::endl;
}
private:
}; int main()
{
A* a = new A();
std::unique_ptr<A> myPtr(a);
myPtr->fun();//重载的->,可以理解为直接返回a指针
(*myPtr).fun();//直接取指向的对象,所以不再使用指针
std::unique_ptr<A> myOtherPtr = std::move(myPtr);//myPtr将指向a的权利移动给myOtherPtr,myPtr变为空指针
assert(myPtr != nullptr);
myOtherPtr.reset();
assert(myOtherPtr != nullptr);
assert(a != nullptr);
getchar();
return 0;
}
二、Qt例子
mainwindow.h:
class A
{
public:
A()
{
qDebug()<<"A";
}
~A()
{
qDebug()<<"~A";
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
Ui::MainWindow *ui;
std::unique_ptr<A> uptr_AllData;
private slots:
};
mainwindow.cpp:
{
std::unique_ptr<A> tmepPtr(new A);//打印A
uptr_AllData = std::move(tmepPtr);//
}
现象:
在new A的时候打印A,在窗口关闭后,自动回收A的内存,打印~A。
三、智能指针数组
mainwindow.h
class A
{
public:
A()
{
qDebug()<<"A";
}
~A()
{
qDebug()<<"~A";
}
void print()
{
qDebug()<<"print function";
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
Ui::MainWindow *ui;
queue<unique_ptr<A>> allPacket; private slots:
void on_pushButton_clicked();
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
{
unique_ptr<A> data(new A);
allPacket.push(std::move(data));
}
} void MainWindow::on_pushButton_clicked()
{
allPacket.front()->print();
allPacket.pop();
}
现象:
在new的时候打印A,在pop之后打印~A
四、智能指针作为参数传递
1、看函数原型

2、传参
核心:转移指针所有权【std::move】,把所有权从实参传到形参
3、作为函数返回值
直接返回,切记不能先move再返回
PS:
1、智能指针的核心就是在析构的时候自动帮你delete所指向的指针。
2、如果希望将此智能指针作为类的属性,那么在赋值的时候:先生成一个临时的智能指针,再用std::move来赋值给这个属性,否则就必须在声明的时候就初始化。
3、使用此智能指针的优点就是不用自己在析构函数中delete指针。【感觉缺点多多了】
unique_ptr智能指针的更多相关文章
- C++11 unique_ptr智能指针详解
在<C++11 shared_ptr智能指针>的基础上,本节继续讲解 C++11 标准提供的另一种智能指针,即 unique_ptr 智能指针. 作为智能指针的一种,unique_ptr ...
- stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...
- 第20课 unique_ptr独占型智能指针
一. unique_ptr的基本用法 (一)初始化方式 1. 直接初始化:unique<T> myPtr(new T); //ok.但不能通过隐式转换来构造,如unique<T&g ...
- 智能指针(1)-std::unique_ptr
std::unique_ptr std::unique_ptr是一种几乎和原始指针一样高效的智能指针,对所管理的指针资源拥有独占权.由C++11标准引入,用于替代C++98中过时的std::auto_ ...
- 智能指针思想实践(std::unique_ptr, std::shared_ptr)
1 smart pointer 思想 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ...
- 智能指针 - 现代C++新特性总结
C++98中的智能指针通过一个模板类auto_ptr来实现,new操作符返回的指针可以交由它来管理,程序员不用再显式的调用delete,这在一定程度上避免了堆内存忘记释放的问题:不过auto_ptr有 ...
- c++ 智能指针(转)
智能指针的使用 智能指针是在 <memory> 标头文件中的 std 命名空间中定义的. 它们对 RAII 或“获取资源即初始化”编程惯用法至关重要. 此习惯用法的主要目的是确保资源获取与 ...
- [C++11新特性] 智能指针详解
动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极为困难的.有时我们会忘记释放内存产生内存泄漏,有时提前释放了内存,再使用指针去引用内存就会报错. 为了更容易(同时也更安全)地使用动态内存, ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
随机推荐
- React组件的定义、渲染和传值总结
一.组件的定义 1.使用JavaScript函数定义 Welcome.js import React from 'react'; function Welcome() { return ( <d ...
- HDU 4862 Jump 任意起点最大权K链不相交覆盖
你可以从任意起点开始起跳最多K次 每次跳你可以选择往右或者往下跳 从(x1,y1)跳到(x2,y2) 消耗的能量是曼哈顿距离-1 但是如果每次跳的起点和终点格子里的数字是相同的为X的话你会得到X能量 ...
- c++ 流对象之streambuf(可当做缓冲区使用)
在C++ 中引入了流的概念,我们很方便的通过流来读写文本数据和二进制数据,那么流对象的数据究竟是怎么存储的呢,为了搞清这个问题,先来看一看c++ 的 io 体系: 由图可以看出,在stream 的实现 ...
- JS创建SVG的问题
在线编辑的一个东西,用的是js+svg,遇到了这样一个问题,就是说我监听页面的单击事件,然后记录下来鼠标单击的位置,给svg添加子标签,然后页面上展示出来 说的可能不大清楚,上代码吧 <!DOC ...
- 【Mac】打开配置文件,添加/修改环境变量
打开文件编辑器: 进入终端,输入open -e .bash_profile或者open -t ~/.bash_profile 打开profile文件 填写配置的环境变量: #示例代码 export ...
- P3599 Koishi Loves Construction——构造题
题目 Task1:试判断能否构造并构造一个长度 $n$ 的 $1...n$ 的排列,满足其 $n$ 个前缀和在模 $n$ 的意义下互不相同 Task2:试判断能否构造并构造一个长度 $n$ 的 $1. ...
- HDU-2082-找单词(母函数)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2082 题意: 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1, ...
- python中的函数、生成器的工作原理
1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c ...
- SublimeText 括号插件 Bracket Highlighter高亮设置
1. ctrl + shift + p,打开命令面板,输入install,在菜单中选择Package Control:Install Package如图 2. 步骤1后弹出的命令输入框中 输入:Bra ...
- java+web+下载断点续传
1.先将 webuploader-0.1.5.zip 这个文件下载下来:https://github.com/fex-team/webuploader/releases 根据个人的需求放置自己需要的 ...