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语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针的更多相关文章

  1. 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配

    垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...

  2. 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

    垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...

  3. 垃圾回收GC:.Net自己主动内存管理 上(三)终结器

    垃圾回收GC:.Net自己主动内存管理 上(三)终结器 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主 ...

  4. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  5. ios内存管理2-对象之间的内存管理

    同之前一样,新建一个基于命令行的工程,在新建一个Student类和一个Book类 编写如下代码: Student.h // // Student.h // 内存管理2-对象之间的内存管理 // // ...

  6. C++内存管理5-处理new分配内存失败情况(转)

    C++内存管理5-处理new分配内存失败情况(转) endl; 参考博客: https://www.cnblogs.com/findumars/p/9905195.html

  7. Java内存管理(一):深入Java内存区域

    本文转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html#undefined 推荐查看原文,原文格式更好一些. 本文引用自:深 ...

  8. IOS ARC内存管理,提高效率避免内存泄露

    本文转载至 http://blog.csdn.net/allison162004/article/details/38756263 Cocoa内存管理机制 (1)当你使用new.alloc.copy方 ...

  9. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

随机推荐

  1. #Leet Code# Binary Tree Max[待精简]

    描述:递归调用,getMax返回 [节点值,经过节点左子节点的最大值,经过节点右节点的最大值],每次递归同时查看是否存在不经过节点的值大于max. 代码:待优化 def getLargeNode(se ...

  2. AngularJS: 自定义指令与控制器数据交互

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. shell编程的一些例子1

    1.$0-$9及$# $@的使用 demo_arg 内容 #!/bin/bash echo "程序名:$0" echo "命令传递参数个数:$#" echo & ...

  4. SQL语句の循环添加数据

    declare @i intset @i=1while @i<=1000begininsert into News_ITM(title,msg,subDateTime,author,imageP ...

  5. Django 1

    Django 1.10文档中文版Part1 本文是博主翻译的Django1.10版本官方文档的第一部分,如时间充裕,争取一直翻译下去,经验不足,或有错漏,敬请指正.另外对于公开文档进行翻译的版权问题不 ...

  6. C51应用 Modbs Rtu协议实现与KEPServerEx 通信

    最近一客户要求使用STC12C5A60S2实现Modbus Rtu协议与KEPServerEx V4.0软件通信,采集单片机P2口每位的状态,设置P0口每位的状态,实现三路AD转换其中一路采集的是C0 ...

  7. Learning LexRank——Graph-based Centrality as Salience in Text Summarization(一)

    (1)What is Sentence Centrality and Centroid-based Summarization ? Extractive summarization works by ...

  8. The state of binary data in the browser

    The state of binary data in the browser Or: "So you wanna store a Blob, huh?" TL;DR Don't ...

  9. 【POJ2773】Happy 2006 欧几里德

    题目描述: 分析: 根据欧几里德,我们有gcd(b×t+a,b)=gcd(a,b) 则如果a与b互质,则b×t+a与b也一定互质,如果a与b不互质,则b×t+a与b也一定不互质. 所以与m互质的数对m ...

  10. PHP SSL Module "subjectAltNames"空字节处理安全绕过漏洞

    漏洞版本: PHP 5.3.27 PHP 5.4.17 PHP 5.5.1 漏洞描述: Bugtraq ID:61776 PHP是一种HTML内嵌式的脚本语言 PHP SSL模块不正确处理服务器SSL ...