c++动态内存知识总结与疑问
书名 BOOK TITLE
《Primer c++ 第5版》
基本信息 BASICS
- 阅读进度:第12章动态内存
阅读心得 LEARNINGS
- 在c++中,我知道的有静态内存、栈内存、和动态内存三种,其中 静态内存的成员用static修饰,一旦声明,及时是在局部的函数内部使用,也得等到整个程序结束才会消失。(这里我的疑问,我还从没见过静态的指针变量,这种变量可以有吗?如果存在,它属于静态内存还是动态内存?它该怎么消亡。)
- 栈内存,是用在函数块里面声明的变量,其特点是变量在出了作用域块之后,就自动出栈,并且先构建的变量要后出栈。
- 最后个动态内存,它是在堆上的内存,普通形式就是以指针的形式存在在代码中。可用智能指针(shared_ptr、unique_ptr、weak_ptr)降低使用难度,如果是普通的指针,无论是在函数块内还是成员变量,如果不手动delete,它会一直存在(程序结束了,都没有释放内存,这个内存它还存在吗?我猜,是不会存在的,因为在操作系统上,一个进程或线程结束了,其中的内存就会被回收掉,而一个程序有可能就是线程或者进程)
- delete只能进行一次,如果删除了还继续删除,其行为是未定义的(会不会造成这个内存无法在被回收分配了?)
- delete之后,会产生空悬指针,其危害和未初始的指针一样,所以在初始化和删除指针时都要进行 ptr=NULL的操作。
- 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++动态内存知识总结与疑问的更多相关文章
- C++ Primer 5th 第12章 动态内存
练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...
- [C语言] 数据结构-预备知识动态内存分配
动态内存分配 静态内存分配数组 int a[5]={1,2,3,4,5} 动态内存分配数组 int len=5; int *parr=(int *)malloc(sizeof(int) * len) ...
- C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问
0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生 ...
- iOS开发——C篇&动态内存分配
再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再 ...
- iOS开发——C篇&动态内存分析
再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数(堆 ...
- C语言中动态内存的分配(malloc,realloc)
动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...
- 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章 STM32H7的TCM,SRAM等五块内 ...
- String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类
1:String类型 #include <iostream> using namespace std; int main() { //初始化方法 string s1 = "hel ...
- c++动态内存管理与智能指针
目录 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动释放相关联对象的内存 ...
随机推荐
- phaser2->3:来个打地鼠试水
本文中phaser具体版本 phaser2:2.8.1 phaser3:3.17.0 一.实现效果二.实现细节三.项目总结四.参考文档 一.实现效果 源码地址(phaser2&phaser3) ...
- 美团新零售招聘-高级测试开发(20k-50k/月)
内推邮箱:liuxinguang@meituan.com 地点:北京 职位级别:p2-2以上级别 15.5薪
- ado.net DataSet
一.概念 DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataS ...
- git指令-工作区和暂存区
#git指令-工作区和暂存区 工作区(Working Directory):就是平常电脑可以看到的文件夹目录 版本库(Repository):存放git内容的文件夹例如: Git的版本库里存了很多东西 ...
- Java 读取Word中的脚注、尾注
本文介绍读取Word中的脚注及尾注的方法,添加脚注.尾注可以参考这篇文章. 注:本文使用了Word类库(Free Spire.Doc for Java 免费版)来读取,获取该类库可通过官网下载,并解压 ...
- JavaFX之多个FXML加载和通信
前言 在使用了FXML设计布局后,新的问题随之而来,当一个程序需要多个界面时,我们不可能在一个FXML中写出全部布局,这样太过于臃肿不易查看和维护(当然非要这么做也是可以的),这里就涉及到如何在一个F ...
- MongoDB复制集概念架构浅析
一.复制集的作用 (1) 高可用 防止设备(服务器.网络)故障. 提供自动failover 功能. 技术来保证数 (2) 灾难恢复 当发生故障时,可以从其他节点恢复. (3) 功能隔离 用于分析.报表 ...
- 学妹问的Spring Bean常用配置,我用最通俗易懂的讲解让她学会了
你好呀,我是沉默王二,一枚有趣的程序员,写的文章一直充满灵气,力求清新脱俗.昨天跑去王府井的小米店订购了一台小米 10,说是一周之内能到货,但我还是忍不住今天就想见到她.见我茶不思饭不想的,老婆就劝我 ...
- js 渐变运动框架
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ubuntu下使用apt-get install安装软件的安装位置
在ubuntu下使用 apt-get install 或 apt install 下载安装软件,软件下载及安装后的目录.: A.下载的软件的存放位置:/var/cache/apt/archives B ...