C++ 智能指针六
/* 智能指针unique_ptr */ #include <iostream>
#include <string>
#include <memory>
#include <vector> /*
unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现),
定义于 memory (非memory.h)中, 命名空间为 std. unique_ptr 不支持拷贝和赋值. */ struct Student
{
public:
Student(std::string name_, int age_) :name(name_), age(age_) {}
std::string name;
int age; }; std::unique_ptr<Student> test_clone()
{
std::unique_ptr<Student> up1 = std::make_unique<Student>("spaow",);
return up1;
} struct STDeleter
{
void operator() (int* obj)
{
if (obj)
{
for (int i = ; i < ; i++)
{
//obj[i] = i + 2;
printf("obj[i] = %d\n", obj[i]);
}
free(obj);
obj = NULL;
}
}
}; void test()
{
//初始化方式一
std::unique_ptr<Student> up1 = std::make_unique<Student>("tom",); //error unique_ptr 不支持拷贝构造函数
//std::unique_ptr<Student> up2(up1); //error unique_ptr 不支持赋值
//std::unique_ptr<Student> up3 = up1; //初始化方式二
std::unique_ptr<Student> up4(new Student("jack", )); //初始化方式三:
/*
release方法: 放弃内部对象的所有权,将内部指针置为空, 返回所内部对象的指针, 此指针需要手动释放
*/
std::unique_ptr<Student> up5(up1.release()); //初始化方式四
/*
reset方法: 销毁内部对象并接受新的对象的所有权(如果使用缺省参数的话,也就是没有任何对象的所有权, 此时仅将内部对象释放, 并置为空)
*/
std::unique_ptr<Student> up6;
up6.reset(new Student("als", )); //成员函数的使用 //可以进行移动构造和移动赋值操作
std::unique_ptr<Student> up7;
up7 = std::move(up6); std::unique_ptr<Student> up8(std::move(up7)); //特殊的拷贝
std::unique_ptr<Student> up9 = test_clone(); printf("name is [%s] .\n",up9->name.c_str()); //在容器中保存指针
std::vector<std::unique_ptr<Student> > vec;
std::unique_ptr<Student> upTmp(new Student("kld",));
vec.push_back(std::move(upTmp)); //unique_ptr 支持管理数组
std::unique_ptr<int[]> ups(new int[]); printf("sizeof(ups) = %d\n", sizeof(ups));//打印4,并非数组实际长度 for (int i = ; i < ; i++)
{
ups[i] = i;
printf("ups[i] = %d\n", ups[i]);
} //自定义删除器定义
int *tempArr = (int *)malloc(sizeof(int) * );
std::unique_ptr<int, STDeleter> usp2(tempArr, STDeleter()); int *pcIndex = usp2.get();
for (int i = ; i < ; i++)
{
pcIndex[i] = i+;
} } int main()
{
test();
getchar();
return ;
}
C++ 智能指针六的更多相关文章
- 【C++】智能指针简述(六):智能指针总结及补充
本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容. 总结: 1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时 ...
- C++2.0新特性(六)——<Smart Pointer(智能指针)之shared_ptr>
Smart Pointer(智能指针)指的是一类指针,并不是单一某一个指针,它能知道自己被引用的个数以至于在最后一个引用消失时销毁它指向的对象,本文主要介绍C++2.0提供的新东西 一.Smart P ...
- c++ auto_ptr智能指针
c++ auto_ptr智能指针 该类型在头文件memory中,在程序的开通通过 #include<memory> 导入,接下来讲解该智能指针的作用和使用. 使用方法: auto_ptr& ...
- C++智能指针简单剖析
导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...
- STL模板_智能指针概念
一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...
- 【转】C++智能指针简单剖析
原文链接:http://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看 <C++ Primer Plus>第六版,这的确是本好书 ...
- 【C++】智能指针简单剖析
转自 http://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中 ...
- c/c++ 智能指针 shared_ptr 使用
智能指针 shared_ptr 使用 上一篇智能指针是啥玩意,介绍了什么是智能指针. 这一篇简单说说如何使用智能指针. 一,智能指针分3类:今天只唠唠shared_ptr shared_ptr uni ...
- [转]C++智能指针简单剖析
C++智能指针简单剖析 https://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看<C++ Primer Plus>第六版 ...
随机推荐
- Codeforces.914D.Bash and a Tough Math Puzzle(线段树)
题目链接 \(Description\) 给定一个序列,两种操作:一是修改一个点的值:二是给一个区间\([l,r]\),问能否只修改一个数使得区间gcd为\(x\). \(Solution\) 想到能 ...
- 潭州课堂25班:Ph201805201 第十五课 迭代器,生成器 (课堂笔记)
推导表达式 li1 = list() for i in range(10): # 迭代循环内容 li1.append(i) print( li1 ) ---->>> [0, 1, 2 ...
- 简单的运动学,用canvas写弹力球
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 跟之前的随笔一样,因为本人仍是菜鸟一只,所以用到的技术比较简单,不适合大神观看...... 学canvas学了有一个多礼拜了,觉得canv ...
- DB2表不活动的处理方法
DB2表不活动的处理方法(转载)首先查一下: db2 57016 SQLSTATE 57016: 因为表不活动,所以不能对其进行访问. 解决方法为:执行命令:reorg table XXX:即可. 参 ...
- HBase官方文档 之 Region的相关知识
HBase是以Region为最小的存储和负载单元(这里可不是HDFS的存储单元),因此Region的负载管理,关系到了数据读写的性能.先抛开Region如何切分不说,看看Region是如何分配到各个R ...
- android:ProgressBar控件
ProgressBar 用于在界面上显示一个进度条,表示我们的程序正在加载一些数据.它的用 法也非常简单,修改 activity_main.xml 中的代码,如下所示: <LinearLayou ...
- OKHttpUtil工具类
导入jar包下载链接 http://square.github.io/okhttp/ package com.common.util; import java.io.IOException; impo ...
- Map和String类型之间的转换
前提是String的格式是map或json类型的 public static void main(String[] args) { Map<String,Object> map = new ...
- WPF获取当前用户控件的父级窗体
方式一.通过当前控件名获取父级窗体 Window targetWindow = Window.GetWindow(button); 方式二.通过当前控件获取父级窗体 Window parentWind ...
- Effective Java 第三版——50. 必要时进行防御性拷贝
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...