new & malloc的区别

 

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对分配的对象进行初始化。   
 

 

posted @ 2009-12-17 16:15  Jade  阅读(641)  评论(0编辑  收藏  举报