设为首页 加入收藏

TOP

C++拾遗--malloc free与new delete的同与不同
2015-03-04 22:51:44 来源: 作者: 【 】 浏览:46
Tags:拾遗 --malloc free new delete 不同

前言


在C中我们常使用malloc和free来动态分配与释放内存,在C++中对应的是new和delete。这里我们来探讨下他们的同与不同。


正文


1.内置类型


对相同的代码进行调试,查看内存


#include
using namespace std;
int main()
{
?int *p = (int*)malloc(sizeof(int) * 10);
?cout << p << endl;
?//断点
?for (int i = 0; i < 10; i++)
? p[i] = i;
?//断点
?free(p);
?//断点
?cin.get();
?return 0;
}


调试





同样的功能使用new和delete来操作


#include
using namespace std;
int main()
{
?int *p = new int[10];
?cout << p << endl;
?//断点
?for (int i = 0; i < 10; i++)
? p[i] = i;
?//断点
?delete[]p;
?//断点
?cin.get();
?return 0;
}


调式





对于内置类型,两组操作的效果是一样的。


2.类类型


代码一


#include
using namespace std;
class MyClass
{
public:
?MyClass()
?{
? cout << "MyClass create" << endl;
?}
?~MyClass()
?{
? cout << "MyClass delete" << endl;
?}
};
int main()
{
?MyClass *p1 = (MyClass *)malloc(sizeof(MyClass));
?free(p1);
?cout << "--------------------" << endl;
?MyClass *p2 = new MyClass;
?delete p2;
?cin.get();
?return 0;
}


运行



malloc 只是分配了内存,而new 不仅分配了内存,还调用了构造函数。


free 只是释放了内存,而delete不仅释放了内存,还调用了析构函数。


代码二


#include
#include
using namespace std;
class MyClass
{
public:
?int *p;
?MyClass()
?{
? //分配400M内存
? p = new int[1024 * 1024 * 100];
? cout << "MyClass create" << endl;
?}
?~MyClass()
?{
? delete[]p;
? cout << "MyClass delete" << endl;
?}
};
int main()
{
?MyClass *p1 = (MyClass *)malloc(sizeof(MyClass));
?//断点
?free(p1);
?//断点
?MyClass *p2 = new MyClass;
?//断点
?delete p2;
?//断点
?cin.get();
?return 0;
}


启动任务管理器,查看内存消耗


malloc free




new delete




由于malloc只是给变量p本身分配了内存,但由于不调用构造函数,所以无法让p指向一片分配的内存。同理,free只是释放了变量p,由于并不调用析构函数,所以无法释放p指向的内存。


------------------------------分割线------------------------------


C语言梳理一下,分布在以下10个章节中:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++拾遗--new delete 重载 下一篇Java信号量Semaphore

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: