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 *p = 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;
}
#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 *p = 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没有.
另外注意,由于malloc和new都是在堆上分配的空间,无法自动释放,需要调用free/delete释放空间。malloc分配的空间用free释放,而new分配的空间用delete释放。
0 0
- new和malloc的区别
- new和malloc的区别
- new和malloc的区别
- malloc和new的区别
- malloc和new的区别
- new和malloc的区别
- malloc和new的区别
- new和malloc的区别
- malloc 和new的区别
- new和malloc的区别
- new和malloc的区别
- malloc和new的区别
- new和malloc的区别
- new和malloc的区别
- malloc和new的区别
- malloc和new的区别
- new和malloc的区别
- malloc和new的区别
- UVA 11401 Triangle Counting(数学)
- oracle 创建过程、函数中as, is区别
- 一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(8)--使用模板创建表单实例
- 内部排序之堆排序
- 骑士飞行棋游戏
- new和malloc的区别
- DLL调用
- 解决doxygen绘制函数调用失败问题
- [Linux高级编程]工具&库
- c语言NULL和0区别及NULL详解
- 现有服务器oracle数据库调优
- 一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(9)--导出模板
- 让PHP跑在Mac OS X中
- HDU 4315 Climbing the Hill(尼姆博弈变形)