码迷,mamicode.com
首页 > 其他好文 > 详细

第42课 内存操作经典问题分析二

时间:2016-04-05 00:30:27      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

1. 常见内存错误

(1)结构体成员指针未初始化

(2)结构体成员指针未分配足够的内存

(3)内存分配成功,但并未初始化

(4)内存操作越界

【实例分析】常见的内存错误1

#include <stdio.h>
#include <malloc.h>

void test(int* p, int size) //对内存操作时,有带长度信息
{
    int i = 0;
    for(i = 0; i<size; i++)
    {
        printf("%d\n",p[i]);
    }

    free(p);//不合符谁申请谁释放原则
            //当p指向一个数组时,该操作是非法的,因为
            //只能free堆中的内存。
}

void func(unsigned int size)
{
    int* p = (int*)malloc(size * sizeof(int));
    int i = 0;

    if(size % 2 != 0)  //当size为奇数时会p产生内存泄漏
    {
         return;
    }

    for(i=0; i<size; i++)
    {
        p[i] = i;
        printf("%d\n", p[i]);
    }

    free(p);

}

int main()
{
    int* p = (int*)malloc(5 * sizeof(int));
    
    test(p, 5); //test内部释放了p所指内存,不符合谁申请谁释放原则

    free(p); //这里重复释放p,会造成程序崩溃

    func(9); //参数为奇数,会造成内存泄漏!
    func(10);//正常

    return 0;
}

2. 内存操作的交通规则

(1)动态内存申请之后,应该立即检查指针的值是否为NULL,防止使用NULL指针

int* p = (int*)malloc(56);

if (p != NULL){

     //do something here!

}

……

(2)free指针之后必须立即赋值为NULL(如free(p);p=NULL;)

(3)任何与内存操作相头的函数都必须带长度信息

void printf(int* p, int size) //带长度信息size
{   

    int i = 0;
    snprintf(buf,sizeof(buf), "%s\n", "Hello World!");

    for(i = 0;i< size; i++){  //长度信息size
        printf("%s\n",p[i])
    }
}

(4)malloc操作和free操作必须匹配,防止内存泄露和多次释放。并且遵循谁申请谁释放的原则。

【实例分析】常见的内存错误2

 

#include <stdio.h>
#include <malloc.h>

struct Demo
{
    char* p;
};


int main()
{
    struct Demo d1;//结构体(内含指针变量)未被初始化
    struct Demo d2;

    char i = 0;
    
    for(i=a; i< z; i++)
    {
        d1.p[i] = i; //d1.p指针未被初始化,内存空间也未分配
    }

    d2.p = (char*)calloc(5, sizeof(char));
    
    printf("%s\n", d2.p);

    for(i=a; i< z; i++)
    {
        d2.p[i] = i;
    }

    free(d2.p);

    return 0;
}

3. 小结

(1)内存错误的本质源于指针保存的地址为非法值(如指针未初始化或指针运算导致的越界)

(2)内存泄漏源于malloc和free不匹配。当malloc次数多于free里产生内存泄漏。反之程序可能崩溃。

第42课 内存操作经典问题分析二

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5353337.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!