您的位置:首页 > 其它

new & malloc的区别

2009-12-17 16:15 417 查看
1。winCE 平台,
2。针对非类对象的操作,例如:char* a = new char[10]; a = malloc(10);

请问这样的两种操作有何不同?
哪位晓得winCE内存管理,或编译器的高手请赐教。
问题点数:0、回复次数:21Top

1 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2003-09-18 11:15:10 得分 0

malloc 返回void*
new 返回构造的对象的型别的指针

winCE内存管理:没接触过!Top

2 楼Yssss1980(小明)回复于 2003-09-18 11:16:16 得分 0

new 调用构造函数Top

3 楼Polarislee(北极星)(无房无车,飘在北京)回复于 2003-09-18 11:17:01 得分 0

new除了会分配内存空间以外还会执行类的构造函数。
除此之外,new可以自动计算需要分配的内存大小,而且new是类型安全的Top

4 楼overawe(理想)回复于 2003-09-18 11:26:36 得分 0

对关键是会调用构造函数,这很重要Top

5 楼l1ul1u(apollo)回复于 2003-09-18 11:38:15 得分 0

malloc 只返回void*,和分配内存空间
new有返回类型,分配内存空间,和调用构造函数
详见《EffictiveC++》Top

6 楼pengcar()回复于 2003-09-18 12:24:08 得分 0

malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。而new/delete则可以。Top

7 楼wangwanjun213(菜鸟)回复于 2003-09-18 12:32:35 得分 0

他们都负责内存分配,但是malloc在分配内存之后不调用函数构造对象。但是new 在分配内存之后调用构造函数构造对象。
此外,free和delete也是有区别的,他们都负责释放空间,但是free 在释放之前不调用析构函数,而delete 在释放内存前调用析构函数析构对象Top

8 楼begginginstorm(和尚)回复于 2003-09-18 12:52:46 得分 0

new不但可以调用构造函数,而且可以让你选择构造函数
比如:
class Data
{
public:
Data(): m_nValue(0),m_pBuf(NULL)
{
}
Data(int value): m_nValue(value), m_pBuf(NULL)
{}
void NewBuffer()
{
if(m_pBuf)
delete[] m_pBuf;
m_pBuf = new char[10];
}
virtual ~Data()
{
if(m_pBuf)
delete[] m_pBuf;
}

private:
int m_nValue;
char *m_pBuf;
};
你可以用 Data *p = new Data(),也可以用Data *p = new Data(10)
而对于delete,可以调用相应的析构函数,而且可以使用虚函数机制,这样可以保证完整的清除对象占用的资源。
而malloc/free除了申请内存、释放内存以外就没有其他功能了。Top

9 楼wangwanjun213(菜鸟)回复于 2003-09-18 13:05:48 得分 0

他们都负责内存分配,但是malloc在分配内存之后不调用函数构造对象。但是new 在分配内存之后调用构造函数构造对象。
此外,free和delete也是有区别的,他们都负责释放空间,但是free 在释放之前不调用析构函数,而delete 在释放内存前调用析构函数析构对象Top

10 楼xuechengw(红桃k')回复于 2003-09-18 13:38:40 得分 0

各位兄弟,感谢大家的回复,但是我想知道的是非类对象,也就是对于内存管理来说,单纯的分配内存,这两种方法有什么区别,我想,如果不同的话,首先是编译器的不同,然后是目标平台的不同,但是具体的不同是什么?Top

11 楼hawkxjy(developer)回复于 2003-09-18 14:02:36 得分 0

对非类对象,使用new 和malloc差别在返回类型上,以及new-delete,malloc-free必须成对,不可混淆Top

12 楼LLnju(LLnju)回复于 2003-09-18 14:06:24 得分 0

CE 下的全局的 new , delete 代码:

void* __cdecl operator new(size_t nSize)
{
void* pResult;
#ifdef _AFXDLL
_PNH pfnNewHandler = _pfnUninitialized;
#endif
for (;;)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
pResult = _malloc_dbg(nSize, _NORMAL_BLOCK, NULL, 0);
#else
pResult = malloc(nSize);
#endif
if (pResult != NULL)
return pResult;

#ifdef _AFXDLL
if (pfnNewHandler == _pfnUninitialized)
{
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
pfnNewHandler = pState->m_pfnNewHandler;
}
if (pfnNewHandler == NULL || (*pfnNewHandler)(nSize) == 0)
break;
#else
if (_afxNewHandler == NULL || (*_afxNewHandler)(nSize) == 0)
break;
#endif
}
return pResult;
}

void __cdecl operator delete(void* p)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
_free_dbg(p, _NORMAL_BLOCK);
#else
free(p);
#endif
}
Top

13 楼herrycsdn(卓一凡)回复于 2003-09-18 14:08:31 得分 0

我觉得对于非类对象,用这两个都可以,Top

14 楼jeckyz(深圳)回复于 2003-09-18 15:02:39 得分 0

严格来说有相当大的区别,不论在什么平台都一样:

new : 准确地说是动态创建对象。当然也是会在 heap 中分配空间的,区别在于它还会调用对象的构造函数进行初始化。同样适用于内建数据类型;

malloc : 仅仅是在 heap 中分配足够的空间。它不作任何的初始化(当然不会调用任何的构造函数),所以只适用于内建数据类型。Top

15 楼jeckyz(深圳)回复于 2003-09-18 16:10:17 得分 0

WINCE 的内存管理有点象 WIN98,但突出 slot 的概念。在整个内存空间中分开哪几个 slots 是系统,哪几个是应用程序可用的,好像系统的共享内存也分开占用一个slot,具体怎么分,说不大准确。虽然可以参考 WINCE 部分源码,但是核心的东西仍然在比尔的保险柜里。模凌两可的文档看了等于白看(而且有些还与实际的有些出入:( )。我也希望有人来补充一下 :)

如果用SDK编写WINCE的程序(非OO),我建议你最好用API来分配内存(尽管可以用 new ),用LocalAlloc就很好,但用 HeapCreate & HeapAlloc 也不过分(注意:WINCE没有全局堆,所以没有 GlobalAlloc)。为什么?因为这样比较快,而且比较稳。在WINCE平台下,一般内存是比较紧的。如果你在用C++开发一个比较大的程序,而且动态内存分配很频繁,那么考虑一下自己管理内存,自己设计一下 memory pool 是个不错的主意。Top

16 楼yudehui(静动风云)回复于 2003-11-08 12:43:27 得分 0

这么精彩
小弟佩服!Top

17 楼linmue(林木)回复于 2003-11-08 17:17:13 得分 0

malloc 是一个函数,它有形参(sizeof(基本数据类型))和返回值(void)
new 不是函数,它只是调用构造函数
相对来说他们的执行效率new要高一些

详情请见 钱能 清华大学出版社出版的那本书Top

18 楼bing_huo(我是一个演员!)回复于 2003-11-10 11:16:25 得分 0

new是c++的操作符
malloc是库函数

new调用类的构造函数
malloc则不Top

19 楼linmue(林木)回复于 2003-11-27 17:46:49 得分 0

函数malloc()是c程序获得堆内存(堆允许程序在运行时(而不是编译时),申请某个大小的内存空间)的一种方法,它在alloc。h头文件中声明。
malloc()函数原型为:
void *malloc(size_t size)
size_t即是unsigned long
该函数在堆内存中“切下”一块size大小的内存,将指向该地址的指针返回。该内存中的内容是未知的。
new和delet是C++专有的操作符,他们不用头文件声明。new类似malloc()函数,分配堆内存,但比malloc()函数简洁。new操作符为数据类型,它可以带初始值表或单元个数。new
返回具有操作数之数据类型的指针。
从C++的立场上看,不能用malloc()函数的一个原因是,它在分配空间的时候不能调用构造函数。类对象的建立的分配空间、构造结构以及初始化的三位一体,它们统一由构造函数来完成。
例如,下面的代码用malloc()分配对象空间:
class Tdate
{
public:
Tdate( );
SetData(int m=1,int d=1,y=2003);
protected:
int month;
int day;
int year;
};

void Tdate::SetData(int m,int d,int y)
{
if(m>0&&m<13)
month=m;
if(d>1&&d<32)
day=d;
if(y>0&&y<3000)
year=y;
}

void fn()
{
Tdata *pb; //仅仅的个指针,没有产生对象
pb=(Tdata *)malloc(sizeof Tdata); //并不调用构造函数
//。。。
free(pb); //并不调用析构函数
}
指针pb的声明不为Tdata调用其构造函数,因为 没有指向任何东西。假如构造函数要被调用,则必须在进行内存分配的malloc()调用时进行。然而malloc()仅仅只是一个函数调用,它没有足够的信息来调用一个构造函数。它所接受的参数是一unsigned long类型。
pb从malloc()那儿获得的不过是一个含有非法数据的类对象空间而已,对应的对象空间中的值不确定。为此,须在内存分配之后再进行初始化。Top

20 楼bluenet21(net21)回复于 2003-11-27 18:42:30 得分 0

用new申请的内存只能用delete释放Top

21 楼TongNi(小白)回复于 2003-11-27 19:36:03 得分 0

使用new比使用malloc()有以下的几个优点:
(1)、new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。
(2、它自动地返回正确的指针类型,不用进行强制指针类型转换。
(3)、可以用new对分配的对象进行初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: