动态内存与智能指针

  在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 的个人理解(十二)的更多相关文章

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

    本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...

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

    标准库没有给每个容器都定义成员函数来实现 查找,替换等操作.而是定义了一组泛型算法,他们可以用于不同类型的元素或多种容器类型. 迭代器令算法不依赖与容器 算法永远不会执行容器的操作 算法本身不会执行容 ...

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

    <C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...

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

    这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...

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

    第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...

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

    在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用.发邮件,并将通过UEditor上传的图片保存到云存储.在项目的最后,再学习优化网站性能的一些技术:缓存和 ...

  7. 学习C++ Primer 的个人理解(零)

    由于自己看书之后经常容易忘记细节,所以写在博客上让我自己的思路更加清晰一些. 我的博客仅仅只是将书中的内容概括一下,有一些不好理解的部分我会用我自己理解的方式使用大白话写出来. 仅此而已.

  8. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...

  9. 算法学习之剑指offer(十二)

    一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

随机推荐

  1. mycat表拆分操作教程

    1,迁移数据 举例说明,比如一个博客数据库数据表如下: 这里水平拆分,垂直拆分,只是做个简单的实验,真正的线上业务要根据情况,数据进行拆分. ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  2. iOS 时间戳转换为时间

    NSString *str=";//时间戳 NSTimeInterval time=[str doubleValue]+;//因为时差问题要加8小时 == 28800 sec NSDate ...

  3. DotNet IOC Framework - Microsoft Unity介绍

    一. 新建一个ASP.NET MVC4项目 二. 安装Microsoft Unity 1) 管理Nuget程序包 2)安装Unity3程序包 在你的App_Start文件夹里会多出来两个文件 三. 一 ...

  4. coffeeScript demo

    #能够直接在浏览器嵌入coffee-script.js 解析xx.coffee脚本,但真正正式使用时不建议这样使用,coffee-script.js下载地址:http://coffeescript.o ...

  5. linux终端或者虚拟机SecureCRT窗体拖动之后,会自己主动收到一个Ctrl+C的命令

    虚拟机中SecureCRT窗体每次鼠标划动和拖动窗体都会出现Crtl+C命令.导致远程Linux连接操作中断 经查找发现是本地机器里安装了相关软件快捷键导致.比方我的有道词典划词功能.取消划词就可以

  6. 数据库升级ora-04063 DBMS_REGISTRY has error

    在做Oracle数据库从11.2.0.1.0升级到11.2.0.2.8时,软件升级没有问题,实例升级没有问题,升级psu的时候. 执行@?/rdbms/admin/catbundle psu appl ...

  7. 全局唯一ID的生成方式

    一.程序直接生成: 使用jdk中的concurrent包可以轻松实现唯一数字型ID的生成,且无需考虑单例.采用高效率的CAS无需考虑synchronized关键字 import java.util.c ...

  8. [AngularJS + cryptoJS + Gravatar] Provider vs factory

    Configurable Bits Need a Provider We want to be able to configure the characterLength before Tweetab ...

  9. 【转】IT职场人生系列之四:怎样写简历

    本文是IT职场人生系列的第四篇. 因为早年跳槽无数,所以积累了不少"技巧",逐渐变成写简历的"专家",最长的时候简历到了12页,所以现在练就一手写长篇博客的功夫 ...

  10. SQL Abstraction and Object Hydration

    SQL Abstraction and Object Hydration In the last chapter, we introduced database abstraction and a n ...