c语言释放指针出错,C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针...

C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

(1)开辟的内存没有释放,造成内存泄露

(2)野指针被使用或释放

(3)非法释放指针

(1)开辟的内存没有释放,造成内存泄露,下面的例子就可能造成20个字节的泄露,内存泄露不是一个立即会引发故障的错误,但是

它将消耗系统内存。

void function1()

{

char *pa;

pa = (char*)malloc(sizeof(char)*20);

if(NULL !=pa)

{

strcpy(pa,”hello”);

printf(“pa = %x\n”,(unsigned int)pa);

printf(“pa = %s\s”,pa);

}

return;

}

(2)野指针被使用或释放

野指针是一个已经被释放的内存指针,他指向的位置已经被使用free或者realloc函数释放了,但是该指针依然在使用。

void function2()

{

char *pa;

pa = (char*)malloc(sizeof(char)*20);

if(NULL !=pa)

{

strcpy(pa,”hello”);

printf(“pa = %x\n”,(unsigned int)pa);

printf(“pa = %s\s”,pa);

}

free(pa);

printf(“ pa = %s”,pa);

return;

}

正确的内存释放应该是下面的

void function2()

{

char *pa;

pa = (char*)malloc(sizeof(char)*20);

if(NULL !=pa)

{

strcpy(pa,”hello”);

printf(“pa = %x\n”,(unsigned int)pa);

printf(“pa = %s\s”,pa);

}

free(pa);

pa = NULL;

if(NULL != pa)

{

printf(“pa = %s\n”,(unsigned int)pa);

}

return;

}

(3)非法释放指针

void function3()

{

char a[20];

int b;

free(a);

free(&b);

return;

}

上面的程序中,a[20]是一个栈上的数组,a是这块内存的地址;b是栈上面的一个变量,&b是它的地址。这些栈上的内存,编译器

将自动管理和回收资源,程序中使用free将他们释放,是一种错误的写法。

char *pa;

pa = (char*)malloc(sizeof(char)*20);

free(pa);

free(pa);

上面的一段程序,将内存释放两次是错误的写法,因为第一次释放后,该地址已经变成,未分配的堆内存,free函数不能释放未分配的堆内存。

char *pa;

char *pa;

pa = (char*)malloc(sizeof(char)*20);

pb = pa++;

free(pb);

在上面的程序中,虽然pa是一个被分配出的堆内存指针,pb作为pa的地址加1,也是一个堆内存的指针,而且这个指针所指向的也是已经分配的内存。然而内存pb依然是非法的内存释放。这是由于这个指针并不是从malloc分配出来的,而是中间的一个指针值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值