C++c语言动态分配内存存和释放

C和C++动态内存分配和释放的区别_百度知道
C和C++动态内存分配和释放的区别
我有更好的答案
原型为void *calloc(unsigned int num, unsigned int size) 
函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
采纳率:92%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。> 问题详情
关于动态存储分配,下列说法正确的是A.new和delete是C++语言中专门用于动态内存分配和释放的函数B
悬赏:0&答案豆
提问人:匿名网友
发布时间:
关于动态存储分配,下列说法正确的是A.new和delete是C++语言中专门用于动态内存分配和释放的函数B.动态分配的内存空间也可以被初始化C.当系统内存不够时,会自动回收不再使用的内存单元,因些程序中不必用delete释放内存空间D.当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new请帮忙给出正确答案和分析,谢谢!
您可能感兴趣的试题
1有以下程序&&#include<iostream>&&using namespace std;&&class MyClass&&{&&public:&&&MyClass(int n){number =n; }&&&//拷贝构造函数&&&MyClass(MyClass& other)&{number=other.number;}&&&~MyClass()&{}&&private:&&&int number;&&};&&MyClass fun(MyClass p)&&{&&&MyClass temp(p);&&&return temp;&&}&&int main()&&{&&&MyClass Obj1(10),obj2(0);&&&MyClass obj3(obj1);&&&obj2=fun(obj3);&&&return 0;&&}&&程序执行时,MyClass类的拷贝构造函数被调用的次数是A.5B.4C.3D.22有如下函数模板的定义:&&template <class T>&&T&func(T&x,T&y){&return&x*x+y*y;}&&在下列对func的调用中不正确的是A.func(3,5);B.func<>(3,5);C.func(3,5.5);D.func<int>(3,5.5);3执行语句:cout<<setfill('*')<<setw(10)<<setfill('#')<<left<<123<<"OK"<<endl;后将输出A.123*******OKB.123#######OKC.123********OK********D.123#######OK########4在下列函数原型中,可以作为类AA构造函数的是A.voidAA(int);B.intAA();C.AA(int)const;D.AA(int);
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号C/C++动态分配与释放内存的区别详细解析_C 语言
作者:用户
本文讲的是C/C++动态分配与释放内存的区别详细解析_C 语言,
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_byte
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。   备注:void* 表示未确定类型的指针,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
1.3 freevoid free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
1.4注意事项1)申请了内存空间后,必须检查是否分配成功。
2)当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
3)这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。4)虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。
malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
2. new运算符
2.1 C++中,用new和delete动态创建和释放数组或单个对象。动态创建对象时,只需指定其数据类型,而不必为该对象命名,new表达式返回指向该新创建对象的指针,我们可以通过指针来访问此对象。int *pi=这个new表达式在堆区中分配创建了一个整型对象,并返回此对象的地址,并用该地址初始化指针pi 。
2.2 动态创建对象的初始化动态创建的对象可以用初始化变量的方式初始化。int *pi=new int(100); //指针pi所指向的对象初始化为100string *ps=new string(10,'9');//*ps 为“”
如果不提供显示初始化,对于类类型,用该类的默认构造函数初始化;而内置类型的对象则无初始化。也可以对动态创建的对象做值初始化:int *pi=new int( );//初始化为0int *pi=//pi 指向一个没有初始化的intstring *ps=new string( );//初始化为空字符串 (对于提供了默认构造函数的类类型,没有必要对其对象进行值初始化)
2.3 撤销动态创建的对象delete表达式释放指针指向的地址空间。// 释放单个对象delete [ ]//释放数组如果指针指向的不是new分配的内存地址,则使用delete是不合法的。
2.4 在delete之后,重设指针的值 //执行完该语句后,p变成了不确定的指针,在很多机器上,尽管p值没有明确定义,但仍然存放了它之前所指对象的地址,然后p所指向的内存已经被释放了,所以p不再有效。此时,该指针变成了悬垂指针(悬垂指针指向曾经存放对象的内存,但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。一旦删除了指针所指的对象,立即将指针置为0,这样就非常清楚的指明指针不再指向任何对象。(零值指针:int *ip=0;)
2.5 区分零值指针和NULL指针零值指针,是值是0的指针,可以是任何一种指针类型,可以是通用变体类型void*也可以是char*,int*等等。空指针,其实空指针只是一种编程概念,就如一个容器可能有空和非空两种基本状态,而在非空时可能里面存储了一个数值是0,因此空指针是人为认为的指针不提供任何地址讯息。
2.6 new分配失败时,返回什么?1993年前,c++一直要求在内存分配失败时operator
new要返回0,现在则是要求operator
new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator
new(以及operator
new[])以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象: class
分配失败抛出std::bad_alloc
这个检查一定失败
若分配失败返回0
这个检查可能会成功
3. malloc和new的区别
3.1 new 返回指定类型的指针,并且可以自动所需要大小。比如:   1) int *p;   p = //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);   或:   int*   parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;   
2) 而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。   int*   p = (int *) malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
3.2 malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
4.有了malloc/free为什么还要new/delete?
1) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存分配
详细设计 存储分配、如何释放dhcp分配的ip、考研分数详细分配、主存分配与释放、虚拟内存的分配与释放,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!动态分配内存与释放内存中出现的有关问题 - C++当前位置:& &&&动态分配内存与释放内存中出现的有关问题动态分配内存与释放内存中出现的有关问题www.MyException.Cn&&网友分享于:&&浏览:8次动态分配内存与释放内存中出现的问题#include &iostream&
#include &math.h&
using & namespace &
void & main()
int & i,j,p;
int & k=0;
int & m,n,
cout & & &Please & Entere & the & value & of &
'n ' & & &
m=1+(int)(n*log10(2));
mul=new & int(m);
res=new & int(m+1);
cout & & &m= & & &m & &
for(i=1;i &m;i++)
for(i=0;i &n;i++)
for(j=0;j &m;j++)
& res[k]=mul[j]*2+res[k];
temp=res[k];
if(res[k-1]& =10)
res[k-1]=res[k-1]%10;
& res[k]=temp/10;
for(p=0;p &k;p++)
mul[p]=res[p];
for(i=m-1;i& =0;i--)
cout & &mul[i];
delete & [] &//加上这一句连结果也没有
delete & [] &//加上这一句同上
该程序是想计算2的N次方,用固定数组的时候能得到正确的结果,但用的动态分配内存后就出现问题了,计算2的10次方以前的结果正确,但往后就出现警告,小的还可以有结果,但到到了解到100次方时就连结果都没有了,就只有警告,不知是何原因,请高手们帮忙看看,期待中.....
------解决方案--------------------mul=new int(m);
res=new int(m+1);
===================
mul=new int[m];
res=new int[m+1];
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 netty 内存分配释放 的文章

 

随机推荐