什么时候必须采用动态内存分配函数 c++

第25卷第4期2009年4月赤峰学院学报(自然科;Apr.2009;C++动态内存分配研究;王金玲1,柴万东2;(1.赤峰学院;计算机科学与技术系,内蒙古;赤峰;.赤峰学院;物理与电子信息工程系);摘要:本文介绍了C++中内存的分配方式及动态内存;文献标识码:A;文章编号:X(;运算符,不在编译器控制权限之内
第25卷第4期2009年4月赤峰学院学报(自然科学版)JournalofChifengUniversity(NaturalScienceEdition)Vol.25No.4Apr.2009C++动态内存分配研究王金玲1,柴万东2(1.赤峰学院计算机科学与技术系,内蒙古赤峰.赤峰学院物理与电子信息工程系)摘要:本文介绍了C++中内存的分配方式及动态内存分配中常见的内存错误及处理方法.关键词:内存;new;delete;内存泄露TP312中图分类号:文献标识码:A文章编号:X(9-02运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.因此C++语言提供了一个能完成动态内存分以及一个能完成清配和初始化工作的运算符new,理与释放内存工作的运算符delete.2.1运算符new的用法new()new[](1)(2)C++是面向对象的程序设计语言,它继承了C语言的优点,又增加了面向对象的新特征,是受到广大程序设计者欢迎的开发工具.但在C++的使用过程中,关于内存的使用和管理是程序设计者感到非常神秘而又容易出错的地方.本文对C++的内存分配方式,new和delete运算符的使用及动态内存分配中常见的错误和处理方法进行了分析和研究.11.1内存分配方式C++中的内存分配方式有三种:从静态存储区域分配.在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都static变量.存在.例如全局变量,1.2在栈上分配内存,也称为自动存储.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.1.3从堆上分配,亦称动态内存分配.这种堆对象被创建在内存一些空闲的存储单元中,程序在运行程的时候用malloc或new申请任意大小的内存,序设计者自己负责在何时用free或delete释放内使用非存.动态内存的生存期由程序设计者决定,常灵活,但问题也最多.2动态内存分配运算符在C语言中使用malloc/free函数进行动态内存的分配与释放.C++为了兼容C,也保留了这两个函数.但对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是赤峰学院科学研究基金资助(ZRYB200603)基金项目:式(1)表明在堆中建立一个由给定的类型的对象,并且由括号中的给出被创建对象的初始值.如果省去括号和括号中的初始值,则被创建的对象选用缺省值.式(2)表明创建一个由给定的类型的对象数组.使用new运算符创建对象时,它可以根据其参数来选择适当的构造函数,它不用sizeof来计算对象所占的字节数,可以自动计算其大小.如果new运算符不能分配到所需要的内存,它将返回0,这(2)创建数组时,不能为时的指针为空指针.使用式该数组指定初始值,其初始值为缺省值.2.2运算符delete的用法deletedelete[](3)(4)式(3)表明释放使用new运算符所创建的堆对象的存储空间.式(4)用于释放对象数组的存储空并且不管所删间.此时指针名前只用一对方括号,除数组的维数,忽略方括号内的任何数字.3常见的内存错误及其对策在进行内存分配时,发生内存错误是件非常麻烦的事情.编译器不能自动发现这些错误,通常是?19?在程序运行时才能捕捉到.而这些错误大多没有明显的症状,时隐时现,增加了改错的难度.常见的内存错误主要集中在以下几方面:3.1内存分配未成功,却使用了它刚学习C++的学生常犯这种错误,因为他们没有意识到内存分配会不成功.解决办法很简单,那就是在使用内存之前检查指针是否为NULL.如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理.3.2它犯这种错误主要有两个原因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致.所以无论用何种方式创引用初值错误(例如数组)建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦.3.3内存分配成功并且已经初始化,但操作越过“多1”或者例如在使用数组时经常发生下标“少1”的操作.特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界.3.4忘记了释放内存,造成内存泄露内存泄露是指程序从堆中分配的内存块,使用或者没完后,程序没有调用delete释放该内存块,有正确的释放该内存块,这样,这块内存就不能被再次使用,称之为内存泄漏.含有这种错误的函数每被调用一次就丢失一块内存.刚开始时系统的内存充足,你看不到错误,接着运行速度会逐渐变慢.但最后程序会突然死掉,系统出现提示:内存耗尽.3.5释放了内存却继续使用它)程序中产生这种情况的原因有以下几种:(1的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数.2)函据结构,从根本上解决对象管理的混乱局面(数的return语句写错了,注意不要返回指向“栈内的“指针”或者“引用”,因为该内存在函数体结存”.3)使用free或delete释放了内存束时被自动销毁(后,没有将指针设置为NULL.导致产生“指针悬.空”4合理使用new和delete的几点建议针对上文介绍的3.4和3.5情况在使用new和delete运算符时有如下几点建议,可以大大减少内存泄露和指针悬空的情况.4.1动态内存的申请与释放必须配对了内存的边界内存分配虽然成功,但是尚未初始化就引用4.2程序中new与delete的使用次数一定要相同,否则肯定有错误.对应的new和delete要采用相同的形式new的执行过程是先分配内存,然后,为被分配的内存调用一个或多个构造函数.delete的执行过程是先为将被释放的内存调用一个或多个析构函数,然后,释放内存.对于delete来说要分辨被释放的指针指向的是单个对象呢,还是对象数组?如果在用delete时没用括号,delete就会认为释放的是单个对象,否则,它就会认为释放的是一个数组.所以,解决这类问题的规则是:如果你调用new时用了[],调用delete时也要用[].如果调用new时没有用[],那调用delete时也不要用[].4.3在析构函数里对指针成员调用delete对于delete来说,释放空指针是安全的.所以,在写构造函数,赋值操作符,或其他成员函数时,类的每个指针成员要么指向有效的内存,要么就指向NULL,那在析构函数里就可以使用delete释放空间,而不用担心他们是不是指向有效的存储空间.4.4杜绝“悬空指针”“悬空指针”不是NULL指针,而是指向“垃圾”内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是“悬空指针”是很危险if语句对它不起作用.的,形成“悬空指针”的成因主要有两种:(1)指针变量定义后没有被初始化.任何指针它的缺变量刚被创建时不会自动成为NULL指针,指针变量在创省值是随机的,它会乱指一气.所以,建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存.例如char*p=NULL;char*str=newchar(100);(2)指向某内存的指针被delete释放之后,没有置为NULL,让人误以为该指针是个合法的指针,所以产生引用错误.因此,当指针被delete释放后,要将指针置为NULL.5总结内存管理是所有C++程序开发中的重要内容,正确而有效的使用和管理内存是程序开发的关应该认识到键步骤.在学习和使用C++的过程中,内存管理问题的重要性.学习内存使用的正确模式,快速发现可能发生的错误,争取在一开始就养成内存管理的优良编程习惯,通过制订一些计划和实践,找到控制内存错误的方法.?20?三亿文库包含各类专业文献、各类资格考试、幼儿教育、小学教育、行业资料、专业论文、外语学习资料、生活休闲娱乐、应用写作文书、高等教育、C++动态内存分配研究72等内容。 
 C++中在子函数中动态分配内存
17:23 C++中动态分配指针时,很容易碰到的问题是:子函数中分配的动态数组, 在子函数外部无法访问。跟 踪变量发现:传入...  其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统 优先使用空闲区低端的空间。 2)假设初始状态如下,可用的内存空间为 640KB,并有下列的请求序列; 自拟...  C++基础教程-动态内存分配 (Dynamic memory)_IT/计算机_专业资料。C++基础教程-动态内存分配 (Dynamic memory) memory) 动态内存分配 (Dynamic memory) 到目前为止,...  C++中如何动态分配内存_计算机软件及应用_IT/计算机_专业资料。malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算 符。它们都可用于申请动态...  本文背景: 在编程中,很多 Windows 或 C++的内存函数不知道有什么区别,更别谈有效...需要动态的增加堆栈大小,本文没有对这个进行研究,但是 试图通过分配另外内存区,...  C和 C++ 语言动态内存分配 一、C 语言动态内存分配 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用 C 语言提供的几个标 准库函数。(使用时应...  C语言动态内存分配研究及应... 2页 免费 C和C++ 语言动态内存分配 2页 2财富值 C语言动态内存分配 5页 2财富值 C语言动态内存分配函数解析... 11页 免费 ...  链表的C语言实现之动态内存... 2页 1财富值 C语言动态内存分配研究及应......C和C++ 语言动态内存分配C和C++ 语言动态内存分配隐藏&& 分享到:
X 分享到...&&&&&&&&&&&&C++动态内存分配
正在努力加载播放器,请稍等…
正在努力加载播放器
大小:158.50KB&&所需金币:50
&& & 金币不足怎么办?
下载量:-次 浏览量:101次
贡献时间: 16:18:12
文档标签:
已有-位用户参与评分
同类热门文档
你可能喜欢
看过这篇文档的还看过
阅读:151&&下载:4
阅读:208&&下载:2
阅读:135&&下载:0
阅读:73&&下载:0
阅读:60&&下载:0
阅读:63&&下载:0
阅读:75&&下载:0
阅读:55&&下载:0
阅读:95&&下载:0
阅读:96&&下载:0
该用户的其他文档
所需财富值:
50文件大小:158.50KB
您当前剩余财富值:&&
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
举报该文档侵犯版权。
例: /help.shtmlc与c++分别是怎样动态分配和释放内存的,有什么区别?(转) demo大全
我的图书馆
c与c++分别是怎样动态分配和释放内存的,有什么区别?(转) demo大全
查了查资料,总结了以下几点: 
一、先来谈谈在C语言下,动态内存分配和释放的特点。
动态分配内存的定义是这样的,指在程序运行过程中,要申请内存,系统会根据程序的实际情况来分配,分配空间的大小是由程序的需求来决定的。在C语言下面,举个例子,定义一个指针,int *p;此时指针i是一个野指针,是一个指向不确定位置的指针,对它进行操作是很危险的,此时我们需要动态分配内存空间,让i指向它。而有一种形式是这样的,int *p=&b;这并非是一种动态内存分配方式,而是一种指针的初始化,把变量b的首地址给了指针p。在C语言下究竟如何实现动态内存分配的呢?这里提供了几个函数来实现,分别是malloc(),calloc(),realloc(),而释放内存的函数为free(),分别探讨他们的异同。
1.malloc函数
  函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。
2.calloc 函数
函数原型为void *calloc(unsigned int num, unsigned int size)
  按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
3. realloc函数:
  函数原型为void *realloc(void *ptr, unsigned int size)
重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地址(该地址可能与以前的地址不同)。例如p1=(float *)realloc(p1,16);将原先开辟的8个字节调整为16个字节。
**动态申请的内存空间要进行手动用free()函数释放
4. free函数:
  函数原型为void free(void *ptr)
  将以前开辟的某内存空间释放。函数原型为 void free(void *ptr)其中ptr为存放待释放空间起始地址的指针变量,函数无返回值。应注意:ptr所指向的空间必须是前述函数所开辟的。例如free((void *)p1);将上例开辟的16个字节释放。可简写为free(p1);由系统自动进行类型转换。
二、C++语言动态内存分配
C++语言中用new和delete来动态申请和释放内存。
1. 申请单个对象
  int *p;
  p=或者 p=new int(value);
  2. 动态申请数组
  int *p;
  p=new int [100];
  这样可以申请长度为100的数组,但是不能进行初始化。
 3. delete
  int *p, *q;
  q=new int[10];
  delete [ ]q;
1 new 是个操作符 malloc是个分配内存的函数,供你调用的.
2 new 建立的是一个对象,会调用构造函数。
malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
参考资源来源:/zhj202190/archive//2043620.html
http://apps./share/detail/
TA的最新馆藏[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢推荐这篇日记的豆列
&&&&&&&&&&&&博客访问: 657562
博文数量: 259
博客积分: 10081
博客等级: 上将
技术积分: 2585
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
阅读(6960) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 vmware 动态内存分配 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信