new delete malloc free区别

系统 1619 0

回答此问题时,照下面顺序回答:

1、malloc  free是库函数,new  delete是运算符。

 

2、malloc free只是申请/释放内存,不能构造和析构对象;new  free可以申请/释放内存,构造/析构对象。

 

3、举例说明第2点:

      #include <iostream>

#include <stdlib.h>

using namespace std;



class Test

{

public:

	
      
        int
      
       a;

	Test()

	{

		a = 1;

	}

};




      
        int
      
       main()

{

	Test *pTestNew = new Test[3];

	Test *pTestMalloc = static_cast<Test*>(
      
        malloc
      
      (3 * 
      
        sizeof
      
      (Test)));



	cout << pTestNew[0].a << endl;    	
      
        //1
      
      

	cout << pTestMalloc[0].a << endl; 	
      
        //随机数
      
      
        return
      
       0;

}


    

4、malloc申请内存失败返回NULL,new申请内存失败则抛出异常(1993年以前也是返回0,现在要使用返回0时,new的入口点采用nothrow对象)。

    class widget { ... };



widget *pw1 = new widget;// 分配失败抛出std::bad_alloc if



if (pw1 == 0) ...	// 这个检查一定失败

	widget *pw2 = new (nothrow) widget; 	// 若分配失败返回0

	

if (pw2 == 0) ...	// 这个检查可能会成功


  

5、new operator = operator new + placement new

new operator就是上面讲的new.

new operator(申请内存+构造对象) = operator new(申请内存) + placement new(构造对象)

 

(1)operator new若一次没申请成功,则一直在申请内存,直到new_handler为空抛出异常。

operator new的伪代码看起来会象下面这样:
void * operator new(size_t size)        // operator new还可能有其它参数
{                                      

  if (size == 0) {                      // 处理0字节请求时,
    size = 1;                           // 把它当作1个字节请求来处理
  }                                    
  while (1) {
    分配size字节内存;

    if (分配成功)
      return (指向内存的指针);

    // 分配不成功,找出当前出错处理函数
    new_handler globalhandler = set_new_handler(0);
    set_new_handler(globalhandler);

    if (globalhandler) (*globalhandler)();
    else throw std::bad_alloc();
  }
}

 

(2)placement new的使用。placement new构造对象,已申请的内存buffer指向该构造函数。

      class Widget

{

public:

	Widget(
      
        int
      
       widgetSize);

};



Widget* constructWidgetInBuffer(
      
        void
      
       *buffer, 
      
        int
      
       widgetSize)

{

	
      
        return
      
       new (buffer) Widget(widgetSize);

}
    

new delete malloc free区别


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论