C++相关总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++相关总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6135字,纯文字阅读大概需要9分钟。
内容图文
![C++相关总结](/upload/InfoBanner/zyjiaocheng/619/88ede5d11b8847ff8250b4c83398da8c.jpg)
1. 内存泄漏 & 内存溢出
参考:https://blog.csdn.net/buutterfly/article/details/6617375
memory leak, out of memory
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
memory leak会最终会导致out of memory!
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.
以发生的方式来分类,内存泄漏可以分为4类:
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
2.extern C的作用
参考:
https://baike.baidu.com/item/extern%20%22C%22/15267013
extern C的主要作用是为了能够正确实现C++代码调用其他C语言代码。加上extern C后,会指示编译器这部分代码按C语言进行编译,而不是C++。
实现C++与C及其他语言的混合编程。
由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中(例如函数 void foo(int x,int y)编译后的名字可能为:_foo_int_int,包含了函数名,函数参数数量以及类型信息),而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名(例如:void foo(int x,int y) 被C编译器编译后再符号库中的名字为_foo)。
3.malloc和new,free和delete的区别
参考:https://zhuanlan.zhihu.com/p/72333166
1. malloc和free是库函数,而new和delete是C++操作符;
2. new自己计算需要的空间大小,例如:int* a = new int(2),malloc要指定大小,例如:int* a = malloc(sizeof(int));
3.new在动态分配内存的时候可以初始化对象,调用其构造函数,delete在释放内存时调用对象的析构函数。而malloc只分配一段给定大小的内存,并返回该内存首地址指针,如果失败则返回NULL;
4. new是C++操作符,是关键字,而operator new是C++库函数;
5. operator new/operator delete可以重载,而malloc不行;
6. new可以调用malloc来实现,但是malloc不能调用new来实现;
7.对于数组,C++定义了 new[] 用于进行动态数据分配,用 delete[] 进行数组销毁。new[] 会一次分配内存,然后多次调用对象的构造函数;delete[] 会先调用多次对象的析构函数,然后一次性释放内存空间;
例如:
char* p = new char[100]; char* p = malloc((char)*100;
8. malloc能够直观地重新分配内存
使用malloc分配内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针指向的内存是否有足够的连续空间。如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果不够,先按照新制定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。
new没有这样直观的配套设施来扩充内存。
4. 指针和引用的区别
引用,与指针类似,存储着一个指向内存中某对象的地址。可以认为引用是变量的一个别名。
- 与指针不同的是,引用被初始化后不能再指向另一个对象,或设置为null;
- 指针可以指向另外一个指针,但是引用只能指向对象;
- 指针可以存储在数组里,但是引用不能。
- 引用保存对象的地址,且行为类似于一个对象。
引用的规则:
引用被创建时必须被初始化,指针则可以在任何时候被初始化
不能有null引用,引用必须与合法的存储单元关联(因此如果函数参数为引用,则不用检查该参数是否为nullptr)
一旦引用被初始化,就不能改变引用的关系;指针则可以随时改变所指对象;
引用主要作用:传递函数的参数、返回值
C++中函数参数和返回值的传递方式有三种:值传递、指针传递、引用传递。
5.常用的容器
参考:https://zhuanlan.zhihu.com/p/163305376
vector
可以当做数组使用,区别在于空间运用特灵活,数组是静态空间,vector是动态空间,随着使用动态增长大小。
查找复杂度O(1),插入和删除复杂度O(n),尾部插入删除O(1)
主要用于存储数据,查找记录,修改少。
list
链表,底层实现为双向链表,查找O(n),插入删除O(1)
主要用于插入删除较多情况。
stack
栈,先进先出,只能操作栈顶,不能操作中间数据。
queue/priority_queue
FIFO队列,先进先出,只能操作头尾数据。
set/unordered_set
集合,一般用于记录某数是否出现过,一个集合中一个数只能出现一次,出现多次需要使用multiset
如果在set中存储自定义对象,需要重载operator== 以通过自己写的函数来判断对象是否相等。
注意:operator= ,重载赋值操作符,即用=等号实现对象的赋值
operator==,该操作符用于判断==左右两侧的对象是否相等 ,重载后,可用于find函数的查找,对象放到set时判断是否相等
https://www.cplusplus.com/doc/tutorial/operators/
unordered_set:哈希集合,C++11标准,带hash特性,因此查找时间复杂度为:O(1)
map/unordered_map
map由key value组成,并根据key内部进行了排序。一个key只能对于一个value,如果需要对应多个值则使用multimap
哈希表,查找速度较快,O(1)
https://zhuanlan.zhihu.com/p/48066839
map:
基于红黑树实现,红黑树是自平衡二叉树,保障了良好的最坏情况运行时间,它可以做到在O(logn)时间内完成查找、插入、删除,在对单词时间敏感的场景下建议使用map作为容器。
红黑树是一种二叉查找树,二叉查找树的一个重要形式是有序,且中序遍历时取出的元素是有序的,在对一些需要用到有序性的场景中,使用map。
unordered_map:
基于hash_table实现,一般是由一个大vector,vector元素节点可挂接链表来解决冲突来实现。hash_table最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。
值得注意的是,在使用unordered_map设置合适的hash方法,可以获得良好的性能。
map在增删查三项上均弱于unordered_map,内存使用map略少,但不明显。
在有序性或者对单词查询有时间要求的应用场景下,使用map;其他情况使用unordered_map。
string
字符串
6. volatile关键字的作用
内容总结
以上是互联网集市为您收集整理的C++相关总结全部内容,希望文章能够帮你解决C++相关总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。