C++ part1
C++内存分配
references:
C++ 自由存储区是否等价于堆?
c++ new 与malloc有什么区别
C++, Free-Store vs Heap
1. 栈:由编译器自动分配释放,存放函数的参数值,局部变量等值。
2. 堆:堆允许程序在运行时动态地申请某个大小的内存。通常由malloc/free开辟和释放。
3. 程序代码区:存放函数体的二进制代码。
4. 全局/静态存储区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
5. 常量存储区:存放常量。
(自由存储区:自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。很多编译器的new/delete都是以malloc/free为基础来实现的。)
static关键字
references:
nowcoder
作用、内存分配、初始化、生命周期、作用域
1. 全局静态变量
2. 局部静态变量
3. 静态函数
4. 类的静态成员变量
5. 类的静态函数
C++和C的区别
references:
nowcoder
设计思想上:
C++是面向对象的语言,而C是面向过程的结构化编程语言
语法上:
C++具有封装、继承和多态三种特性
C++相比C,增加多许多类型安全的功能,比如强制类型转换(4个cast)
C++支持范式编程,比如模板类、函数模板等
C++中四种cast转换
references:
c/c++强制类型转换
为何使用dynamic_cast转换类指针时,需要虚函数?
1. const_cast
用于将const指针、引用、对象转为非const。
const int a = 1;
const int* b = &a;
cout << (*b) << endl;
int* c = const_cast<int *>(b);
*c = 10;
cout << (*b) << endl;
2. static_cast
用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知 。
3. dynamic_cast
用于动态类型转换,只用于对象的指针和引用,只能用于含有虚函数的类(因为要通过虚函数表判断继承关系)。支持类向上向下转化。与static_cast不同,向下转化时dynamic_cast会检查操作是否有效,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。
Son *a;
Fa* aa = dynamic_cast<Fa*>(a); \(\quad\) //向上转型
4. reinterpret_cast
处理无关类型之间的转换。比如把指针转为int。
C/C++ 中指针和引用的区别
references:
nowcoder
1.指针有自己的一块空间,而引用只是一个别名;
2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用;
4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;
5.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;
6.指针可以有多级指针(**p),而引用只有一级;
7.指针和引用使用++运算符的意义不一样;
8.如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。
对象通过指针获取申请的堆上内存,指针是指向动态内存区域的唯一方式,而引用实质是对象的一个别名,对象被析构之后,引用将会失效,所以可能会使得堆上的内存空间没有及时释放,造成内存泄露。
C++中的四个智能指针
references:
四种智能指针使用总结
nowcoder
为什么要使用智能指针:
智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
1. auto_ptr(C++11已弃用)
采用所有权模式。
auto_ptr< Obj> p1 (new Obj());
auto_ptr< Obj> p2;
p2 = p1;
此时再调用 p1就会异常,因为 auto_ptr的拷贝构造函数中把真实引用的内存指针进行的转移,也就是说 p2应引用了内存地址,而 p1引用的内存地址为空。
2. unique_ptr
实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。不能拷贝构造,但是可以移动构造和移动赋值。
//移动赋值
unique_ptr< Son> p1(new Son());
unique_ptr< Son> p2 = (std::move(p1));
此时,p1不再拥有对象的内存地址,因为这是手动赋值,所以比auto_ptr安全。
3. shared_ptr
可以多个智能指针同时拥有一个对象。
原理:
使用引用计数,每当引用一次,引用计数加一,每当智能指针销毁了,引用计数就减一,
当引用计数减少到0的时候就释放引用的对象。这种引用计数的增减发生在智能指针的构造函数,拷贝构造函数,赋值操作符,析构函数中。
成员函数:
use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
shared_ptr< Obj> p1(new Obj());
shared_ptr< Obj> p2 = p1;
shared_ptr< Obj> p3(p1);
p2.reset();
cout << p1.use_count() << endl;
4. weak_ptr
因为shared_ptr是一种强引用的关系,智能指针直接引用对象,可能引起循环引用,从而造成内存泄漏。比如此链接
解决这种状况的办法就是将两个类中的一个成员变量改为weak_ptr对象,因为weak_ptr不会增加引用计数,使得引用形不成环,最后就可以正常的释放内部的对象,不会造成内存泄漏。weak_ptr从字面意思上可以看出是一个弱指针,不是说明这个指针的能力比较弱,而是说他对他所引用的对象的所有权比较弱,
weak_ptr是一种不控制对象生命周期的智能指针, 它指向一个shared_ptr管理的对象,他并不拥有所引用对象的所有权,而且他还不能直接使用他所引用的对象(可以通过lock()来获得一个shared_ptr对象)。当一个weak_ptr所观察的shared_ptr要释放它的资源时,它会把相关的weak_ptr的指针设置为空,防止weak_ptr持有悬空的指针。
数组与指针的区别
什么是野指针
Hash冲突的解决办法
- 开放地址法(再散列法):对冲突的键p,以p为基础,得到p1,直到没有冲突。有线性探测再散列、二次探测再散列、伪随机再散列。
- 再哈希法:再哈希一遍。
- 拉链法:用链表存取发生冲突的关键字
C++ part1的更多相关文章
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...
- Linux平台 Oracle 11gR2 RAC安装Part1:准备工作
一.实施前期准备工作 1.1 服务器安装操作系统 1.2 Oracle安装介质 1.3 共享存储规划 1.4 网络规范分配 二.安装前期准备工作 2.1 各节点系统时间校对 2.2 各节点关闭防火墙和 ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
- 薛非《品悟C-抛弃C程序设计中的谬误与恶习》读后感part1【转】
薛非<品悟C-抛弃C程序设计中的谬误与恶习>读后感part1 作者:宝贝孙秀楠﹣大连程序员 发表于2012年10月5日由admin 出处:http://sunxiunan.com/?p=2 ...
- 小课堂Week12 Clean Code Part1
小课堂Week12 Clean Code Part1 今天的主题是函数,让我们看一个函数,找一找其中的"不整洁". 我们也根据这段代码,讨论下对于整洁代码的两个重要原则. publ ...
- 实战Django:简易博客Part1
舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能 ...
- 实战Django:官方实例Part1
[写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心 ...
- K2 Blackpearl开发技术要点(Part1)
转:http://www.cnblogs.com/dannyli/archive/2012/09/14/2685260.html K2 Blackpearl开发技术要点(Part1) 预知后事如何,请 ...
- 小课堂Week8 例外处理设计的逆袭Part1
小课堂Week8 例外处理设计的逆袭Part1 今天和大家讲一本书,书名是<例外处理设计的逆袭>. 为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有 ...
- Asp.Net Design Pattern Studynotes -- Part1
Asp.Net Design Pattern Studynotes -- Part1 let's start with an exampleto entry amazing OO world ! le ...
随机推荐
- [Usaco2009 Feb]Revamping Trails 道路升级
题目描述 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 < ...
- RabbitMQ六种工作模式有哪些?怎样用SpringBoot整合RabbitMQ
目录 一.RabbitMQ入门程序 二.Work queues 工作模式 三.Publish / Subscribe 发布/订阅模式 四.Routing 路由模式 五.Topics 六.Header ...
- java虚拟机——轻松搞懂jvm
一.JVM体系结构概述 JVM位置 JVM体系结构 1.1 类加载器 ClassLoader 类加载器(ClassLoader)负责加载class文件,class文件在文件开头有特定的文件标示,并 ...
- Power of Two Choices 负载均衡
NGINX and the "Power of Two Choices" Load-Balancing Algorithm - NGINX https://www.nginx.co ...
- Cannot assign requested address问题总结
Cannot assign requested address问题总结 - 简书 https://www.jianshu.com/p/51a953b789a4 python3 server.pyE07 ...
- Shiro中Subject对象的创建与绑定流程分析
我们在平常使用Shrio进行身份认证时,经常通过获取Subject 对象中保存的Session.Principal等信息,来获取认证用户的信息,也就是说Shiro会把认证后的用户信息保存在Subjec ...
- 2020最新idea永久激活教程
注:以下为 idea 最新版本 2020.3.2 的永久激活教程,请按照如下步骤安装激活 (webstorm.pycharm 激活方法相同). 步骤一.下载安装包 去到 idea 官网 https:/ ...
- Mysql数据库版本高低引起的group by问题
低版本的Mysql,group by限制性比较小,在进行group by时,select的对象可包含多个,但是换成高版本5.6以上好像,使用group by 以后,select的对象必须也已经被聚合, ...
- nohup和&后台运行,进程查看及终止
文章目录 一.nohup 1.1用途:不挂断地运行命令. 1.2语法:nohup Command [ Arg - ] [ & ] 1.3退出状态:该命令返回下列出口值: 二.& 2.1 ...
- js中的逻辑运算符详解(||、&&、!)
视频地址:https://www.bilibili.com/video/BV1Y7411K7zz?p=1 一直以来都没弄清楚js中的逻辑运算符是怎么回事 , 一直都以为他们的用法和java一样 , 今 ...