前言在C中我们常使用malloc和free来动态分配与释放内存,在C++中对应的是new和delete。这里我们来探讨下他们的同与不同。正文1.内置类型对相同的代码进行调试,查看内存#include <iostream>
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 <iostream>
using namespace std;
int main()
{
int *p = new int[10];
cout << p << endl;
<span style="white-space:pre"> </span>//断点
for (int i = 0; i < 10; i++)
p[i] = i;
<span style="white-space:pre"> </span>//断点
delete[]p;
<span style="white-space:pre"> </span>//断点
cin.get();
return 0;
}调式对于内置类型,两组操作的效果是一样的。2.类类型代码一#include <iostream>
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 <iostream>
#include <new>
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 freenew delete由于malloc只是给变量p本身分配了内存,但由于不调用构造函数,所以无法让p指向一片分配的内存。同理,free只是释放了变量p,由于并不调用析构函数,所以无法释放p指向的内存。------------------------------分割线------------------------------
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm
将C语言梳理一下,分布在以下10个章节中:- Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
- Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
- Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
- Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
- Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
- Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
- Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
- Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
- Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
- Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/114059.htm