C++内存泄漏的常规问题和解决办法

问题:C++内存泄漏:

原因: 内存错误和并非问题。

1,内存泄漏:堆栈内存没有释放,(少量一般无事);(大量内存泄漏)导致内存耗尽,后续分配内存失败,程序奔溃。(少量内存泄漏),程序运行时间长久,也容易奔溃。

2,内存越界访问:(1)读越界,读取不是自己的数据。读取地址无效,程序直接奔溃。读取地址有效,但是数据是随机的,虽然读取成功,但是会发生不可以预料的后果。(2)写越界,或者可以叫做缓存区溢出,因为所写的数据随机,所以后果未知。

3,野指针:释放掉的内存会被内存管理器重新分配内存。此时它(野指针)指向的内存已经被赋予了新的意义。对野指针指向的内存访问,同样会发生不可预知的后果。解决野指针最好的方法:释放内存后立即把对应指针置为空值。

4,空指针:访问空指针指向的内存,一般会导致程序奔溃,或者未知的后果。所以在访问指针指向的内存时,一定要保证指针不是空指针。

5,引用未初始化的变量:未初始化变量的内容是随机的,使用这些数据会造成未知的后果。最好的解决办法:在声明变量的时候就对它进行初始化。

6,不清楚的指针运算:如:int *p=....;p+n等价于(size_t)p+n*sizeof(*p);

7,结构体成员顺序变化引发的错误

8,结构体大小变化引发的错误

9,分配释放不配对

10,返回指向临时变量的指针
栈里面的变量时临时的,当前函数执行完成时,先关的临时变量和参数都被清除了。不能把指向这些临时变量的指针返回给调用这,这样的指针执行的数据是随机的,会给程序造成不可预料的后果。

11,试图修改常量
如:char *p="1234";
*p='1';

12,误解传值和传引用

13,重名符号
关于重名问题可以参考:C++重定义解决方法总结

14,栈溢出

15,误用sizeof
C++通常是按值传递参数,而数组则是例外,在传递数组参数时,数组退化为指针(及按引用传递),此时用sizeof是无法获取数据的大小。

16,字节对齐
字节对齐主要目的是提高内存访问效率,在某些平台上,就不仅仅是效率问题,如果不对齐得到的数据是错误的。大多数情况下编译器会保值全局变量和临时变量按照正确的方式对齐。内存管理器会保证动态按照正确的方式对齐。要注意的是:在不同的类型的变量之间转换时要小心。
字节对齐也会造成结构体大小的变化,在程序内部用sizeof来取的结构的大小就可以了。若数据要在不同的机器间传递时,在通信协议中要规定对齐的方式,避免对齐方式不一致引发的问题。
关于字节对齐问题请参考:关于C++内存中字节对齐问题的详细介绍

17,字节顺序
字节顺序历来是设计跨平台最头痛的问题。字节顺序是关于数据在物理内存中的布局问题,最常见的字节顺序有两种:大端模式和小端模式
大端模式:高位字节数据存放在低地址处,低位字节数据存放在高地址处。
小端模式:低位字节数据存放在内存低地址处,高字节字节数据存放在内存高地址处

如:long n=0x11223344
模式第1字节 第2字节第3字节  第4字节
大端模式0x110x220x330x44
小端模式0x440x330x220x11

在普通软件中,字节顺序问题并不引人注目。而在开发与网络通信和数据交换有关的软件时,字节顺序就要多注意了。

18,多线程共享变量没有用valotile修饰
valotile作用:告诉编译器不要把变量优化到寄存器中。在开发多线程的程序是,如果这些线程共享一些全局变量,这些全局变量最好使用valotile修饰。这样可以避免因为编译器优化而引起的错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值