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来取的结构的⼤⼩就可以了。若数据要在不同的机器间传递时,在通信协议中要规定对齐的⽅式,避免对齐⽅式不⼀致引发的问题。
关于字节对齐问题请参考:
17,字节顺序
字节顺序历来是设计跨平台最头痛的问题。字节顺序是关于数据在物理内存中的布局问题,最常见的字节顺序有两种:⼤端模式和⼩端模式⼤端模式:⾼位字节数据存放在低地址处,低位字节数据存放在⾼地址处。
⼩端模式:低位字节数据存放在内存低地址处,⾼字节字节数据存放在内存⾼地址处
如:long n=0x11223344
模式第1字节 第2字节第3字节  第4字节
⼤端模式0x110x220x330x44
⼩端模式0x440x330x220x11
在普通软件中,字节顺序问题并不引⼈注⽬。⽽在开发与⽹络通信和数据交换有关的软件时,字节顺序就要多注意了。
sizeof 指针18,多线程共享变量没有⽤valotile修饰
valotile作⽤:告诉编译器不要把变量优化到寄存器中。在开发多线程的程序是,如果这些线程共享⼀些全局变量,这些全局变量最好使⽤valotile修饰。这样可以避免因为编译器优化⽽引起的错误。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。