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还会自动释放相关联对象的内存 ...
随机推荐
- 将js进行到底:node学习5
HTTP开发之Connect工具集--中间件 继学习node.js的TCP API和HTTP API之后,node.js web开发进入了正轨,但这就好像Java的servlet一样,我们不可能使用最 ...
- Python包管理工具setuptools相关
setup函数常用参数: --name 包名称 --version 包版本 --author ...
- 两个不错的IT类优质号
虽然标题已经被用烂了,但是我觉得还是用这样的方式介绍这两个不错的公众号,可能你们刚好需要,我刚好知道,仅此而已. 刚认识的一个小哥哥和一个小姐姐,他们都非常优秀,有喜欢Java和Linux的同学千万不 ...
- 初识Machine Learning
What is Machine Learning 定义 Arthur Samuel:Field of study that gives computers the ability to learn w ...
- iPhone5se难逃“酱油”命运?
苹果春季新品发布会即将举行,按照惯例,只会有一些不痛不痒的产品出现,最起码,不会有革命性的爆点,今年大抵相似,最大的亮点莫过于,苹果有可能会推出一款名叫"iPhone5se"的手机 ...
- ThinkPHP判断更新是否成功的正确方法
如何判断一个更新操作是否成功 $Model = D('Blog'); $data['id'] = 10; $data['name'] = 'update name'; $result = $Model ...
- 在线选题系统完善篇(PHP)
第一篇: 选题在线提交系统(html+JS+PHP) 这是当时根据需求做的一个简单的版本,只能适用于这一个场景,而且题目等一系列数据都不能改.然后结束后,我又对重新写了一个有后台管理的选题系统.相对于 ...
- 小程序在ios10.2系统上兼容
1. 定位元素在ios10.2系统上出现样式问题??? 没错,就是在测试在侧道ios10.2系统时发现了样式错误的问题,比如一个Swiper中,最后一个展示有问题. 这是啥原因❓❓❓❓❓❓ 大写的问 ...
- Lambda表达式(JDK8)
在说Lambda表达式之前,先介绍一下函数式接口 函数式接口 就是只定义了一个抽象方法的接口,我们可以使用注解@Functionallnterface,来强约束这种接口为函数式接口.如Runnable ...
- node--CommonJS
1.CommonJS 1)弥补js没有标准的缺陷 2.Node模块 1)分为核心模块和用户自定义模块 2)我们可以把公共的功能抽离为一个单独的js文件作为一个模块 其中的成员和属性外界无法访问,若要设 ...