跳到主要内容

C语言内存血与泪教训——内存使用重要原则

malloc

  • malloc函数使用时一定要包含stdlib.h头文件

    malloc函数原型返回值为void*,

     void *malloc (size_t size);

    如果没有包含头文件,函数没有声明就直接使用,那么C语言默认函数的返回值是int型,即如果没有包含头文件,那么malloc函数的原型为:

    int malloc(size_t size);

     如果编译成64位的应用程序,那么sizeof(int) = 4并且sizeof(void *) = 8, 比如malloc本来返回的地址为0xFFFFFFFFFFFF1111, 由于没有函数声明,系统默认malloc返回的类型为int,将上面的地址高32位截取后就得到0xFFFF11111,即对malloc返回值的任何操作都是在地址0xFFFF11111上做的。如果0xFFFF1111这个地址不可写,那么就会导致coredump的情况。

    如果编译成32位的应用程序,那么sizeof(int) = sizeof(void*) = 4,所以不会出现coredump问题。

  • malloc函数调用时一定要判断size是否大于0

  • malloc函数调用后一定要判断返回值是否为NULL

free

  • free必须与malloc一一对应,最好的原则就是谁申请的内存由谁释放;在做代码走读时,所有的malloc次数与free次数必须是相等的

  • free结束后一定要将对象设置成NULL,在调用free释放前可以判断对象非NULL才进行释放

memcpy

  • memcpy时一定要比较判断目标内存的长度是否大于源内存的长度,否则将过长的内存拷贝到较小内存区域时就会发生踩栈