深入理解C++动态内存管理:malloc/free和new/delete的区别和联系

来源:互联网 发布:李小璐的淘宝店铺 编辑:程序博客网 时间:2024/05/16 08:33

 malloc/free 和 new/delete

相同点:都可以用于申请动态内存和释放内存。申请的内存都在堆上分配。


不同点:1、new/delete是C++的操作符,而malloc/free是C中的函数。
                2、new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。
                3、new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有类型信息的,而malloc返回的是void指针。
                4、new/delete是保留字,不需要头文件支持;malloc/free需要头文件库函数支持。


联系:既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序内存泄漏出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。

          所以new/delete,malloc/free必须配对使用。


示例:

class Array{public :Array(size_t size = 10): _size(size), _a(0){cout << "Array(size_t size)" << endl;if (_size > 0){_a = new int[size];}} ~Array(){cout << "~Array()" << endl;if (_a){delete[] _a;_a = 0;_size = 0;}}private:int*_a;size_t _size;};void Test(){Array* p1 = (Array*)malloc(sizeof (Array));Array* p2 = new Array; Array* p3 = new Array(20);Array* p4 = new Array[10];free(p1);delete p2;delete p3;delete[] p4;}



0 0
原创粉丝点击