回答此问题时,照下面顺序回答:
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);
}
    
  


 
					 
					