new和malloc的区别

来源:互联网 发布:mysql 默认 编辑:程序博客网 时间:2024/04/25 11:37

1. malloc是库函数,在C++程序中,要用到malloc函数,必须包含malloc.h。malloc函数的原型是:void *malloc( size_t size ),其中,size是分配的空间大小。该函数返回一个void类型的指针,因此,在用malloc函数时,往往需要进行数据类型的强制转换:
              int *pm = (int*)malloc(2);
             myclass *pO1 = (myclass *)malloc(2); //myclass是一个自定义的类
       new是C++的一个运算符,一般用法如下:
int *p = new int[10];
              myclass *pO = new myclass;
2. 在分配空间时,malloc只是分配了指定大小的空间,并没有初始化,没有调用类的构造函数。而new不仅分配了空间,同时进行了初始化工作,调用了该对象的构造函数。
如下面的一个例程所示:
#include <iostream.h>
#include 
<malloc.h>

class myclass
{
public:
    myclass();
    
void myfoo();
private:
    
int m_nindex;
}
;

myclass::myclass()
{
    m_nindex 
= 1;
}

void myclass::myfoo()
{
    cout 
<< "  myfoo : m_nindex = " << m_nindex << endl;
}


int main()
{
    
int *= new int[10];
    myclass 
*pO = new myclass;
    myclass 
*pO1 = (myclass *)malloc(2);

    
for(int i =0; i<10; i++)
    
{
        p[i] 
= i;
        cout 
<< p[i] << "    ";
    }


    cout 
<< endl;
    pO
->myfoo();

    pO1[
0].myfoo();
    pO1[
1].myfoo();

    delete[] p;
    delete pO;
    free(pO1);

    
return 0;
}

   运行结果如下:

显然,new调用了类myclass的构造函数,而malloc只是分配了空间,并没有调用构造函数,因此会出现调用myfoo函数时,输出的m_nindex结果具有随机性。也可以通过断点调试观察发现,new调用了构造函数而malloc没有. 

另外注意,由于mallocnew都是在堆上分配的空间,无法自动释放,需要调用free/delete释放空间。malloc分配的空间用free释放,而new分配的空间用delete释放。

0 0
原创粉丝点击