【面试】C++_内存

76 篇文章 1 订阅
2 篇文章 0 订阅

1.内存有哪些问题
2.怎么解决内存问题
3.内存越界会怎么样,
4.内存越界为什么会蹦
5.发现内存泄漏方法
6.内存优化
7.内存池
8.对象池

内存越界
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址
是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由
于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出。
它会产生不可预料的后果,比如把程序返回地址改掉了,使函数返回时跳到未知内存,导致崩溃。

野指针
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。
但是“野指针”是很危险的,
if语句对它不起作用。野指针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,
它也不指向合法的内存块。

另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
参考资料 https://blog.csdn.net/wads23456/article/details/100170693

内存泄漏
1."内存泄露"包括堆内存泄露、栈内存泄露。根据内存的类型,又分为:内存申请、释放,句柄的打开与关闭问题。
2.容易忽视的是栈上的内存泄露,严格来讲是申请的内存超过线程栈空间大小(默认为1MB)。
栈上的内存(即局部变量)是不需要释放的,函数返回自动出栈(释放)。若某时刻超过线程栈空间大小,
造成其它使用栈的地方不能正常工作(如函数调用、SEH等),会使程序崩溃(驱动的话会蓝屏)。
所以申请局部变量内存时,不要太大。
3.堆内存申请、释放。主要是要注意申请的地方要记得释放,以及申请、释放函数要配对使用。
比如malloc和free、new和delete、BSTR的SysAllocString和SysFreeString。
4.还有一个地方也往往被忽略,"句柄的打开与关闭问题"。这个当积累到一定数量,是很占内存的。
可以linux上的加强进程查看工具观察,若handle数量很大或一直在增长,说明有泄漏。
windows下则可以使用微软内核套件SysinternalsSuite出品的procexp.exe工具,

发现内存泄漏
1.分析工具:比如 splint, PC-LINT, BEAM ,MAT ,LeakCanary。
2.手动检测
文本搜索,验证平衡的 *alloc() 和 free() 或者 new 和 delete 的源主体。
3.重载函数 new 和 delete
可以重载内存分配和释放函数 new 和 delete,然后编写程序定期统计内存的分配和释放,
从中找出可能的内存泄漏。或者调用系统函数定期监视程序堆的大小。

解决内存泄漏
1.当使用 C/C++ 进行开发时,采用良好的一致的编程规范是防止内存问题第一道也是最重要的措施。
2.重载函数 new 和 delete
3.智能指针
4.内存池,对象池


参考资料 https://blog.csdn.net/macrossdzh/article/details/5993867


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值