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 ...
随机推荐
- brew install thrift
➜ ~ brew install thriftUpdating Homebrew...Warning: You are using macOS 10.11.We (and Apple) do not ...
- [Dart] Understand Classes and Inheritance in Dart
We will look at how we can create classes and explore some various features. Dart adopts a single-in ...
- Java Part 001( 03_01_数据类型和运算符 )
注释 Java语言的注释一共有三种类型,分别是单行注释.多行注释和文档注释. 1. 单行注释 单行注释就是在程序中注释一行代码,在Java语言中,使用双斜线“//”进行单行注释. 2. 多行注释 多行 ...
- Mina入门级客户端程序实现telnet程序
Mina入门级客户端程序实现telnet程序,其实mina的客户端和服务端很相似 1.编写客户端MinaClient.java和客户端处理类MyClientHandler.java2.MinaClie ...
- 使用webuploader实现大文件传输
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- 模拟I2C协议学习点滴之复习三极管、场效应管
晶体三极管分为NPN和PNP型两种结构形式,除了电源极性的不同工作原理是大致相同的.对于NPN管,它是由2块N型半导体夹着一块P型半导体所组成的,发射区与基区之间形成的PN结称为发射结,而集电区与基区 ...
- 洛谷P1016 旅行家的预算 题解
主要就是注意一下各个变量的类型别弄混了 https://www.luogu.org/problem/P1016 #include<cstdio> using namespace std; ...
- [转]引用模板类中定义的类型(用typedef或using)以及auto、decltype、typename的使用
一.背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名. 最近在写c++代码的时 ...
- linux系列(六):rmdir命令
1.命令格式: rmdir [选项] 目录名 2.命令功能: 该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限. 3.命令参数: - p 删除指定目录后,若该目录的上层 ...
- macOs下安装Android SDK
首先下载 Android SDK for mac 配置安装 1.进入存放 android-sdk-macosx 的目录,然后输入./android sdk就可以调出SDK Manager的图形界面 A ...