学习C++ Primer 的个人理解(十二)
动态内存与智能指针
在C++中, 动态内存用 new来分配空间并返回一个指向该对象的指针
用delete来销毁。
由于手动的对动态内存进行操作容易出现问题。所以新的标准库提供了两种智能指针。
智能指针的行为类似于常规指针。区别在于他负责自动释放所指对象。
shared_ptr : 允许多个指针指向同一个对象。
unique_ptr :独占所指向的对象
weak_ptr :是一种弱引用,指向shared_ptr 所管理的对象
shared_ptr 类
类似vector ,shared_ptr 也是模板,也需要提供额外的信息。
shared_ptr<string> p1; 可以指向string
shared_ptr<list<int>> p2; 可以指向int的list
默认初始化的智能指针中保存着一个空指针。
使用方法与普通指针类似。
make_shared 函数
最安全的分配和使用动态内存的方法是调用 make_shared标准库函数。
此函数在动态内存中分配一个对象并初始化他,然后返回指向此对象的shared_ptr。如:
shared_ptr<int> p3 = make_shared<int>(42) //指向一个值为42的int的shared_ptr
shared_ptr<string> p4 = make_shared<string>(10,'9') //指向一个值为“9999999999”的string
shared_ptr<int> p5 = make_shared<int>() 指向一个值初始化的int,值为0。
类似顺序容器的 emplace 成员,make_shared用其参数来狗仔给定类型的对象。
也可以直接用auto:
auto p6 = make_shared<vector<string>>();
shared_ptr 的拷贝和赋值
拷贝或赋值操作时,每个shared_ptr都会记录有多少其他的shared_ptr指向相同的对象。
auto p =make_shared<int>(42) // p指向的对象只有p一个引用者
auto q(p) // q和p指向相同的对象,此对象有两个引用者。
一旦一个shared_ptr的计数器变为0,他就会自动释放自己所管理的对象。
auto r =make_shared<int>(42); // r指向的int只有一个引用者。
r = q 给r赋值,让他指向另一个地址
r原来指向的对象没有引用这,自动释放。
直接管理内存
不同于智能指针,直接管理内存需要我们通过new和delete来手动分配和释放内存。
我们可以这样:
int *p1 = new int; // pi指向一个动态分配,未初始化的无名对象
也可以:
string *ps = new string; //初始化为空string
int *pi = new int; // P指向一个未初始化的int
在使用完毕后,我们通过delete来释放对象。
学习C++ Primer 的个人理解(十二)的更多相关文章
- 学习C++ Primer 的个人理解(二)
本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...
- 学习C++ Primer 的个人理解(十)
标准库没有给每个容器都定义成员函数来实现 查找,替换等操作.而是定义了一组泛型算法,他们可以用于不同类型的元素或多种容器类型. 迭代器令算法不依赖与容器 算法永远不会执行容器的操作 算法本身不会执行容 ...
- 学习C++ Primer 的个人理解(一)
<C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...
- 学习C++ Primer 的个人理解(九)
这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...
- 学习C++ Primer 的个人理解(三)
第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...
- 学习MVC之租房网站(十二)-缓存和静态页面
在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用.发邮件,并将通过UEditor上传的图片保存到云存储.在项目的最后,再学习优化网站性能的一些技术:缓存和 ...
- 学习C++ Primer 的个人理解(零)
由于自己看书之后经常容易忘记细节,所以写在博客上让我自己的思路更加清晰一些. 我的博客仅仅只是将书中的内容概括一下,有一些不好理解的部分我会用我自己理解的方式使用大白话写出来. 仅此而已.
- c语言学习之基础知识点介绍(十二):结构体的介绍
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...
- 算法学习之剑指offer(十二)
一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...
随机推荐
- mysql之字符集与校对集
一.字符集 1.mysql的字符集设置非常灵活 可以设置服务器默认字符集: 数据库默认字符集: 表默认字符集: 列字符集: 如果某一级别没有指定字符集,则继承上一级. 查看所有字符集语句:show c ...
- libpq程序例子
程序: [root@lex tst]# cat testlibpq.c /* * testlibpq.c * Test the C version of LIBPQ, the POSTGRES fro ...
- main()函数的输入参数 main(int argc, char** argv)
一般简单的C++程序,main函数的写法都是 int main() {... ; return 0;},但是,如果在运行程序时需要有参数输入,可以是使用将主函数写成int main(int argv, ...
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...
- [016]转--C++拷贝构造函数详解
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...
- jQuery执行请求demo
Ajax教程地址 4.3.2 执行GET请求 使用jQuery来执行GET请求有多种可选的方法.最简单的方法是使用$.get(),其参数是一个URL和一个回调函数:该回调函数有两个参数:一个是从服务器 ...
- Oracle建表实例
建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: CREATE TABLE banping ...
- Android View的绘制机制流程深入详解(一)
本系列文章主要着重深入介绍Android View的绘制机制及流程,第一篇主要介绍并分析LayoutInflater的原理, 从而理解setContentView的加载原理.对于LayoutInfla ...
- SQL Server 中添加用户
在对象资源管理器中点击安全性,选择登录名-新建登录名
- servlet 容器,工作原理,优缺点
转自http://blog.sina.com.cn/s/blog_b5a157500101ld71.html servlet:是以java技术为基础,应用于服务器端的程序组件,本质就是java代码,用 ...