书名  BOOK TITLE

  《Primer c++  第5版》

基本信息 BASICS

  1. 阅读进度:第12章动态内存

阅读心得 LEARNINGS

  1. 在c++中,我知道的有静态内存、栈内存、和动态内存三种,其中 静态内存的成员用static修饰,一旦声明,及时是在局部的函数内部使用,也得等到整个程序结束才会消失。(这里我的疑问,我还从没见过静态的指针变量,这种变量可以有吗?如果存在,它属于静态内存还是动态内存?它该怎么消亡。)
  2. 栈内存,是用在函数块里面声明的变量,其特点是变量在出了作用域块之后,就自动出栈,并且先构建的变量要后出栈。
  3. 最后个动态内存,它是在堆上的内存,普通形式就是以指针的形式存在在代码中。可用智能指针(shared_ptr、unique_ptr、weak_ptr)降低使用难度,如果是普通的指针,无论是在函数块内还是成员变量,如果不手动delete,它会一直存在(程序结束了,都没有释放内存,这个内存它还存在吗?我猜,是不会存在的,因为在操作系统上,一个进程或线程结束了,其中的内存就会被回收掉,而一个程序有可能就是线程或者进程)
  4. delete只能进行一次,如果删除了还继续删除,其行为是未定义的(会不会造成这个内存无法在被回收分配了?)
  5. delete之后,会产生空悬指针,其危害和未初始的指针一样,所以在初始化和删除指针时都要进行 ptr=NULL的操作。
  6. delete还有这样的问题,例子:
int* ptr1=new int();
int *ptr2=ptr1;
delete ptr1;
ptr1=NULL;
ptr2=NULL;
//这里我们在指针赋值之后,删除了ptr1,并置为空指针,这个时候ptr2也释放了,
//但并不能让ptr2也重置为空指针,所以需要把ptr2也置为空指针。
//我觉得如果不这样做,在判断ptr2是否为空这里就会出现问题。

7. 当在delete指针之前,发生了异常,并且没有使用try catch,那么这个内存将不会被释放掉。

------------------------------------------------------智能指针部分

1. 我也是第一次接触这个东西,总结起来十分的吃力。智能指针需要引用头文件<memory>。首先我的理解是指向这个内存的智能指针“指向“数量变为0了,程序就会自动释放掉这个内存。分享型智能指针允许有多个分享型指针指向同一内存;unique类型的,只允许一个指针指向这个内存;弱指针,用弱指针指向的内存不增加指向计数。这是我的总体上的了解,下面进行更细致的了解。

2. 智能指针p可以作为判断条件,如果p指向了一个对象则 if(p)为true。

3.分享型智能指针拷贝,作为参数传递给函数,作为函数的返回值,都会增加指针计数器。

4. 当我们给 “分智”指针赋予新值或是被销毁,指针计数器会减1.(被销毁具体指哪些?)

5. “分智”指针 ,若p.use_count()==1 ,则p.unique() 会return true; else return false;

6. shared_ptr<T>p(u),从unique_ptr,将u置为空。

7. 不要使用get初始化另一个智能指针。考虑这样的代码:

shared_ptr<int> p(new int());
int * q = p.get();
{
shared_ptr<int>m(q);
}
int foo = *p; cout << foo << endl;//输出一串很大的数字

8. 使用自己定义的释放函数释放智能指针,及时发生了异常同样能被释放。例如:

void end_conn(conn*p){disConn(*p);}
void f(destination &d,...){
conn c=connect(&d);
shared_ptr<conn>p(&c,end_conn);
//这里的c不是new的,所以要传递一个自己写的删除器end_conn;
}

9. unique_ptr试图拷贝一个unique_ptr指针是错误的。

10. weak_ptr中,w.expired()表示 如果指针计数为0,则这个弱指针过时了,返回true。

11. w.lock() 若expired返回true,则 lock返回空指针,否则返回一个shared_ptr。

c++动态内存知识总结与疑问的更多相关文章

  1. C++ Primer 5th 第12章 动态内存

    练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...

  2. [C语言] 数据结构-预备知识动态内存分配

    动态内存分配 静态内存分配数组 int a[5]={1,2,3,4,5}  动态内存分配数组 int len=5; int *parr=(int *)malloc(sizeof(int) * len) ...

  3. C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问

    0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生 ...

  4. iOS开发——C篇&动态内存分配

    再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再 ...

  5. iOS开发——C篇&动态内存分析

    再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数(堆 ...

  6. C语言中动态内存的分配(malloc,realloc)

    动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...

  7. 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章       STM32H7的TCM,SRAM等五块内 ...

  8. String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类

    1:String类型 #include <iostream> using namespace std; int main() { //初始化方法 string s1 = "hel ...

  9. c++动态内存管理与智能指针

    目录 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动释放相关联对象的内存 ...

随机推荐

  1. Microsoft Hyperlapse——让第一人称视频更快更流畅

    Hyperlapse--让第一人称视频更快更流畅" title="Microsoft Hyperlapse--让第一人称视频更快更流畅"> 职业摄影师Nick Di ...

  2. react-native start 启动错误解决方法

    ERROR Error watching file for changes: EMFILE {"code":"EMFILE","errno" ...

  3. RocketMQ集群平滑下线或重启某个节点

    1.现状描述 集群其中一台物理机未知原因导致单用户无法登陆机器,该物理机需要重启修改密码或者重装系统.该台为master节点,运行正常.配置策略为: 异步刷盘 主从异步复制 如果直接下线该master ...

  4. OpenGL Panorama Player

    JMGL_PANO star_war_eve source 1 star_war_eve source 2 1. 介绍 JMGL_PANO 是Justin开源的一个全景视频播放器(Github).基于 ...

  5. HTML5全屏背景视频与 CSS 和 JS(插件或库)

    译文原链接:http://codetheory.in/html5-fullscreen-background-video/ 前言: 当网页载入时,自动播放的全屏背景视频已经成为当前颇受欢迎的趋势. 就 ...

  6. 5G时代,会有什么奇葩事儿?

    ​ 在3GPP RAN第187次会议关于5G短码方案的讨论中,中国华为推荐的PolarCode方案获得认可,成为5G控制信道eMBB场景编码的最终解决方案.坦白讲,笔者在读这个新闻的时候,手里备着一本 ...

  7. JMeter接口测试-计数器

    前言 在测试注册接口的时候,需要批量注册账号时,每注册一个并且需要随时去修改数据,比较繁琐,除了使用随机函数生成账号,我们还可以使用计数器来进行批量注册. 一:添加配置元件-计数器 二:注册10个账号 ...

  8. C++走向远洋——65(十五周、项目一)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  9. sql的练习题

    表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_i ...

  10. Java基础篇(02):特殊的String类,和相关扩展API

    本文源码:GitHub·点这里 || GitEE·点这里 一.String类简介 1.基础简介 字符串是一个特殊的数据类型,属于引用类型.String类在Java中使用关键字final修饰,所以这个类 ...