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分配出来的。而是中间的一个指针值。
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针的更多相关文章
- 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配
垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- 垃圾回收GC:.Net自己主动内存管理 上(三)终结器
垃圾回收GC:.Net自己主动内存管理 上(三)终结器 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主 ...
- 从内存管理原理,窥探OS内存管理机制
摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...
- ios内存管理2-对象之间的内存管理
同之前一样,新建一个基于命令行的工程,在新建一个Student类和一个Book类 编写如下代码: Student.h // // Student.h // 内存管理2-对象之间的内存管理 // // ...
- C++内存管理5-处理new分配内存失败情况(转)
C++内存管理5-处理new分配内存失败情况(转) endl; 参考博客: https://www.cnblogs.com/findumars/p/9905195.html
- Java内存管理(一):深入Java内存区域
本文转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html#undefined 推荐查看原文,原文格式更好一些. 本文引用自:深 ...
- IOS ARC内存管理,提高效率避免内存泄露
本文转载至 http://blog.csdn.net/allison162004/article/details/38756263 Cocoa内存管理机制 (1)当你使用new.alloc.copy方 ...
- Linux内核笔记--内存管理之用户态进程内存分配
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
随机推荐
- java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)
head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数.该怎么理解呢? 看例子: public class Test1 { pu ...
- 开发语言大PK:php和Java哪个更好?
Java通过jdbc来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库.访问数据库的接口比较统一. PHP对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强.例如 ...
- Linux脚本(二)
1.for循环以及加法的使用 portStr=`lsof -i:56801 | head -2`count=0for str in `lsof -i:56801 | head -2`do ((coun ...
- css3百叶窗轮播图效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- OGNL-action
需要注意的是,action需要先被调用到,OGNL才能成功,因为action被执行才被压入值栈 package com.wolfgang.action; import com.opensymphony ...
- tyvj 1150 绳子围点 Pick定理 防溢出策略
P1150 - 绳子围点 From 332404521 Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 最近小小鱼在研 ...
- 【技术贴】解决127.0.0.1和http://localhost均被拦截跳转到另一个网页
很艰难的历程. 今天安装一个OA系统,要用到http://127.0.0.1输入完成之后,可以进入安装界面,but,我输入完了之后,自动跳到了129129垃圾网站,艹,我真TM服了,我把本地连接网线都 ...
- 深入了解一下PYTHON中关于SOCKETSERVER的模块-C
同时处理多个客户端请求,并且为不同的CLIENT开不同的线程处理. 这个东东,就显然实用性稍强了一些.(FORK和THREAD方式均可,但各有应用) #!/usr/bin/env python fro ...
- mysql 字段存储类型
摘自:http://zuo.ai.xiao.blog.163.com/blog/static/6079155320121293750732/ 1.数字类型 ...
- java 集合接口及类