zoukankan      html  css  js  c++  java
  • 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对分配的对象进行初始化。   
     

  • 相关阅读:
    C++11线程池
    muduo的事件处理(Reactor模型关键结构)
    sed和awk
    gdb
    C#访问级别
    C#表达式树浅析
    C#并发实战Parallel.ForEach使用
    c#获取本月有哪些周六、周日
    重装了Devexpress后项目报Dll引用找不到问题解决办法
    C#单例模式
  • 原文地址:https://www.cnblogs.com/Jade2009/p/1626486.html
Copyright © 2011-2022 走看看