以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  C++中内存的分配  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=30155)


--  作者:bnflower
--  发布时间:4/7/2006 2:22:00 PM

--  C++中内存的分配
有一个结构A
下面是构造A的内存空间方法:
1)A* a = new A;

2)A* a = (A*)malloc(2*sizeof(A));  

3)A* a = new A; a = (A*)malloc(2*sizeof(A));

4)A a;

这四者的内存分配是否如下:
1)在堆里分配一个sizeof(A)大小的内存空间,a指向该内存空间首址。

2)在堆里分配一个2*sizeof(A)大小的内存空间,a指向该内存空间首址。

3)在堆里分配一个sizeof(A)大小的内存空间,a指向该内存空间首址。随后又在堆里分配了一个2*sizeof(A)大小的内存空间,并修改了a指针指向该内存空间首址。这样由前一步new出来的内存空间就没有指针指向,也就不能通过delete a来释放其占用的内存空间了,这造成了内存泄漏。

4)在栈里分配了sizeof(A)的内存空间,该内存空间在a超出了其作用域后,由系统自动回收。

通过A *a = new A 与 A *a = (A*)malloc(sizeof(A))分配的内存动作是相似的?同时在堆里动态分配了sizeof(A)大小的内存空间。

A a1[20]; A *a2 = a1;的结果是否和A* a3 = (A*)malloc(20*sizeof(A))的结果相同?起一个的内存分配应该是在栈上进行,在超出了a2的作用域后,a2所指向的a1的内存空间会被释放(即在堆上释放了sizof(a1)到小的内存空间)。同过a3指向的内存空间必须通过free来手工释放。

大家请发表一下自己的看法...


--  作者:rong9.13
--  发布时间:4/9/2006 11:10:00 AM

--  
我基本同意楼主的看法
在c++中一般都用new,它比c中的malloc中的用法简单.
应用程序数据所占的内存分为:静态存储区、栈和堆。
在程序运行开始前就分配的存储空间都在静态存储区中.
A a1[20]; A *a2 = a1;分配的内存应该是在静态存储区中,局部变量在栈中分配存储空间.
呵呵^^^^^不知道对不对,malloc函数分配的内存空间使用也困扰了我好长时间^^
--  作者:bnflower
--  发布时间:4/17/2006 9:00:00 PM

--  
使用malloc和new的区别现在认为是这样的:

new有两个动作:1、为对象分配内存空间
                        2、初始化已分配内存空间的对象

malloc只用一个动作:即只进行内存空间的分配,而该内存中的对象并没有被进行初始化。这样该对象的值都是一些随机值。

大家的意见呢


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
48.340ms