`
ribishuangba
  • 浏览: 290072 次
文章分类
社区版块
存档分类
最新评论

指针部分释疑之二:内存的分配及内存错误类型

 
阅读更多

二、内存的分配及内存错误类型

1.内存的分配方式

内存分配方式有三种:

1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3)从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

2.newdelete/mallocfree

mallocfreeC++/C语言的标准库函数,new/deleteC++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数,而是C++的运算符。

newdeletemallocfree混在一起用也是个坏想法。对一个用new获取来的指针调用free,或者对一个用malloc获取来的指针调用delete,理论上是可以的,但其后果是不可预测的。大家都知道不可预测的意思:它可能在开发阶段工作良好,在测试阶段工作良好,但也可能会最后在你最重要的客户的脸上爆炸。

3.deletefree对指针做了什么

大家都知道deletefree都是释放内存的,但是释放的内存是谁的内存?是指针变量在内存中的空间还是指针变量指向的内存?这个大家一定要弄清楚,答案是后者。

char *p = (char *) malloc(100);

strcpy(p, hello);

free(p); // p 所指的内存被释放,但是p所指的地址仍然不变

// 释放的概念只是一种对该段内存unlock,而并不是删掉p中所存储的地址值

if(p != NULL) // 没有起到防错作用,因为p是有值的

{

strcpy(p, world); // 出错

}

这里有很重要的两个原则:

1)指针消亡了,并不表示它所指的内存会被自动释放。

2)内存被释放了,并不表示指针会消亡或者成了NULL指针

因此,一旦我们用了newmalloc申请了空间,切记要用deletefree进行释放之;一旦用deletefree将动态申请的内存释放了,一定不要忘了将指针变量赋值为Null

PS:如果申请的空间是一个动态数组,用delete释放的时候切记要在delete后面加上[],否则delete只会释放数组的第一个元素的空间,后面的都不会被释放掉,造成内存泄露。

4.动态内存不释放会怎么样

很多初学指针的人在用new/malloc申请空间后经常会忘记将空间delete/free而且从效果上来看也没什么甚至会认为系统会自动释放,看下例:

void main(void)

{

float *p = NULL;

while(TRUE)

{

p = new float[1000000];

cout << eat more memory << endl;

}

}

这段程序运行一下,明显是一个无限循环,典型的只有new而没有delete的情况,找一个内存监控软件查看一下内存损失情况就明白了。如果强行Ctrl+C终止程序,然后关掉VC会怎么样?申请的空间会释放吗?答案是不会,一定不会!

有时我们为确保安全性喜欢将程序这样写:

void main(void)

{

float *p = NULL;

while(TRUE)

{

p = new float[1000000];

cout << eat memory << endl;

if(p==NULL)

exit(1);

}

}

看上去很好,即申请不成功(即内存被全部吃掉)就会调用exit1)而将该“坏”程序杀掉,这样有用吗?不一定。

32位系统中,操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。所以,我们在写程序动态申请内存的时候一定要注意这方面的问题。

分享到:
评论

相关推荐

    指针的指针,引用,指针的引用,以及动态内存分配malloc讲解

    要理解malloc函数就必须理解指针的指针,引用,指针的引用,以及动态内存分配。 程序中的内存分为两种:栈内存和动态内存。 静态声明定义变量都是在栈内存中分配空间,在栈空间中会自动释放,而动态分配内存空间是...

    动态分配二维指针内存

    二维数组指针分配 形式有多种 可以指定一维 分配一维 也可以不指定都分配

    指针和内存分配详解

    深入的探讨了,指针和内存问题,很好的帮你解决指针和内存的各种疑惑

    VB 指针 内存分配

    分配内存 用法和C的malloc同理 别忘记释放内存

    C++程序内存分配讲解

    讲解目录 1、问:程序运行需要哪些空间?答:栈区、堆区、常量区等。 2、问:动态空间如何使用?答:通过指针 3、问:常量一定是在常量区吗?答:不一定 4、问:宏定义的常量是怎么...10、问:内存如何对齐?答:少对多

    关于程序设计的内存分配问题

    不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下。 此文章有2个用处, 1:这是个小论文,格式完整,大家...

    通过指针读写内存.e

    易语言通过指针读写内存 .版本 2 .子程序 _按钮_复制内存_被单击 .局部变量 地址, 整数型 .局部变量 缓冲区, 文本型 地址 = 写内存 () 缓冲区 = 取空白文本 (API_取文本长度 (地址) + 1) API_复制内存 (缓冲区...

    C++指针与动态分配 内存new关键字专题

    本文是学习C++的基础内容,指针是C或C++所特有的,因此应熟练掌握指针的使用,本文集中介绍C或C++中的各种指针,包括指针数组,数组指针,常量指针,指向指针的指针,尤其是对二维数组和指针进行了详细精辟的解释,...

    易语言防止程序退出内存错误

    易语言防止程序退出内存错误源码,防止程序退出内存错误,干进程,取得ID,强力打开进程,取字节集指针,取进程ID,ShowWindow,ZwQueryInformationProcess,ZwDuplicateObject,ZwQuerySystemInformation,ZwOpenProcess,...

    C++动态内存分配(new/new[]和delete/delete[])详解

    C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数需要计算...

    指针与内存分配PPT

    指针与内存分配PPT,介绍超级详细,看了就能懂,内含具体代码例子,极易上手。

    C指针系列之跨函数内存申请

    简单的C语言中使用指针在子函数内部申请内存并返回给主函数使用的范例。

    易语言内存指针模块

    易语言内存指针模块源码,内存指针模块,指针_取子程序地址,取当前参数个数,指针_取通用类型,指针_强制转换,指针_取变量指针,指针_取,指针_取变量数据地址,指针_到整数,指针_是否有效,数组_通用加入成员,数组_取数组...

    通过指针的指针传地址修改值的内存分析图

    通过指针的指针传地址修改值的内存分析图原件。 通过OmniGraffle Pro 在 mac os 10.8.4下编辑。 原文地址:http://blog.csdn.net/luanqunmo/article/details/9067865

    收集的内存管理内存分配资料

    内存 内存管理 内存分配 指针 数组 指针与数组...等等之间的详细介绍和比较

    指针是C语言可以用来直接访问内存地址

    3. 动态内存分配和释放 4. 结构体和链表操作 在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们可以通过这个指针来访问和操作这块...

    delphi内存分配完全总结

    delphi内存 内存分配 delphi内存的完全总结

    C/C++指针引用及动态内存分配详细解析

    通过例子解析指针引用及动态内存分配觉得有用看好再下

    C指针示例分析(超全面)

    要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。  先声明几个指针放着做例子:  例一:  (1)...

    C++智能指针(含内存计数)

    C++智能指针(含内存计数) 完美解决内存泄漏问题。 使用智能指针就像使用指针自己一样方便

Global site tag (gtag.js) - Google Analytics