学习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原来指向的对象没有引用这,自动释放。

  

时间: 2024-12-06 12:26:21

学习C++ Primer 的个人理解(十二)的相关文章

学习C++ Primer 的个人理解(二)

到了第二章,其实才算是真正的开始.也就是本书的第一部分C++基础. 第一章可以说就是第一部分的一个简单的梗概. 从第二章开始,对C++的学习步入正轨,从最基础的开始学起,也就是 变量. 而说到变量就不得不说类型. 第二章讨论的主要就是如下几点: 1.什么是基本类型,什么是复合类型? 2.什么是变量,什么是常量? 3.什么是类型别名 4.定义数据结构(struct) 我认为本章讨论常量的部分,对后面的学习影响很大,如果没有理解清楚const的复合类型的一些细节问题,会对后面函数和类的部分的学习造成

学习C++ Primer 的个人理解(十)

标准库没有给每个容器都定义成员函数来实现 查找,替换等操作.而是定义了一组泛型算法,他们可以用于不同类型的元素或多种容器类型. 迭代器令算法不依赖与容器 算法永远不会执行容器的操作 算法本身不会执行容器的操作,他只会运行于迭代器之上. 算法永远不会改变底层容器的大小,有可能改变元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素. 只读算法 类似find就是这样一种算法,只会读取其输入范围内的元素,永远不会改变元素. accumulate也是只读算法. int sum = accumu

学习MVC之租房网站(十二)-缓存和静态页面

在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用.发邮件,并将通过UEditor上传的图片保存到云存储.在项目的最后,再学习优化网站性能的一些技术:缓存和页面静态化. 使用缓存可以降低数据库的压力,而使用页面静态化则可以降低Web服务器的压力. 一 缓存 ASP.NET下可用的缓存为System.Web.Caching.Cache,保存在服务器内存中,不适用于服务器集群,虽然也用没用过集群,但现在的主流都使用NoSQL数据库来做缓存,典型的有Redis和Mem

学习C++ Primer 的个人理解(九)

这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很快,但是在尾部之外的部分插入或删除元素可能会很慢. deque : 随机访问的速度很快,在头和尾插入或删除的速度都很快. list: 双向链表,只支持双向顺序访问,在任何位置插入或删除操作都很快(链表的特性) forward_list: 单向链表,只支持单向的随机访问.在任何位置插入或删除都很快 a

学习C++ Primer 的个人理解(三)

第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vector的各种操作,读者仅仅只需要知道vector可以做这些操作,真正用到的时候,能够想起来,再去查就好了. 在看<UNIX环境高级编程>的时候,各种系统调用,不可能每一个都记得熟,所以我认为这种只需要知道“可以这么做“就行了,用到的时候再查,久而久之自然就熟悉了. 然而关键的是为什么,比如为什么要

学习C++ Primer 的个人理解(一)

<C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐<C++程序设计>. 首先是第一章,第一章可以说是本书第一部分的一个简略的概括.对于有其他编程语言经验的读者来说,看完这章基本可以看出C++的基本语法与其他语言的差异.对于零基础的读者,可以跟着书中内容写一些小程序了. 本主要介绍了以下几点: 1.一个最简单的C++程序是什么样的. 2.初步了解输入流和

我的学习之路_第三十二章_HttpServletRequest

HttpServletRequest 取得请求行的信息: 返回值 : String getMethod() 请求方式 返回值 : String getRequestURI()请求目标 返回值 : String getProtocol() 使用协议 取得请求头的信息: 返回值 : String getHeader(String name) 传一个请求头的key值,返回一个请求头的value值 返回值 : String getHeaderNames(String name) 取得所有请求头的名字,封

学习C++ Primer 的个人理解(六)

第四章和第五章没什么特别的.基本上就是书本上的字面意思,也没什么需要注意的细节.直接记录第六章. 本章介绍了函数,其实也没什么特别的.但有几个重点 1.形参的类型决定了形参和实参的交互方式.形参是引用,则它将绑定到实参上. 2.实参的值拷贝给形参时,形参和实参是两个相互独立的对象. 当初始化一个非引用类型变量时,初始值被拷贝给变量.此时对变量的改动不会影响初始值. 3.对于指针形参,函数接收一个指针,实际上跟非引用类似,拷贝的是指针的值,两个指针是不同的指针 C++中,建议用引用类型的形参代替指

学习C++ Primer 的个人理解(七)

类,后面还有两章是介绍有关于类的内容的.这一张依然只是个概括.但也已经将大致用法介绍完了. 重点如下: 1.成员函数的声明,必须在类的内部. 2.引用const成员函数 我们知道成员函数中有一个名为this的隐式参数,相当于调用它的那个对象. 默认情况下,this是顶层const的.也就意味着,我们不能把this绑定到一个常量对象上. 还记得第二章关于const的细节问题么? this是顶层const的,意味着this本身不能被改变. 而如果对象是一个常量对象,那我就不能把this绑定到对象上.