我们都知道C利用库函数malloc和free来分配和释放内存,C++提供较为简单而功能强大的运算符new和delete来取代malloc和free;但C++为了兼容C语言,同样保留了malloc和free,只是不建议用户使用而已。那么C++两对内存分配和释放函数(或操作符)是否完成同样的功能?能不能混搭使用?它们之间有什么不同?
首先从下面的几个例子开始分析和回答这几个问题
例1:基础类型混搭使用malloc/free和new/delete
#include <iostream> using namespace std; void main(){ int *p = (int *)malloc(sizeof(int)); *p = 10; delete p;
int *p2 = new int; *p2 = 20; free(p2);
int *p3 = new int(30); printf("*p3:%d \n", *p3); free(p3);
cout<<"is ok..."<<endl; system("pause"); return ; } |
//例2:数组类型混搭使用malloc/free和new/delete
#include <iostream> using namespace std;
void main(){ //c语言分配数组 int *p = (int *)malloc(sizeof(int) * 10); p[0] = 1; delete[] p;
//c++分配数组 int *pArray = new int[10] ; pArray[1] = 2; free(pArray); cout<<"is ok..."<<endl; system("pause"); return ; }
|
//例3:对象类型混搭使用malloc/free和new/delete
#include <iostream> using namespace std;
class Test { public: Test(int _a){ a = _a; cout<<"构造函数执行" <<endl; } ~Test(){ cout<<"析构函数执行" <<endl; } private: int a; };
//分配对象new delete //相同 和 不同的地方 new能执行类型构造函数 delete操作符 能执行类的析构函数
void main(){ //c Test *pT1 = (Test *)malloc(sizeof(Test)); delete pT1;
//c++ Test *pT2 = new Test(10); free(pT2);
cout<<"hello..."<<endl; system("pause"); } |
在vs2015上编译以上几个例子的代码并没有报错,也能运行,代表C与C++两者的内存分配和释放机制可以混合使用;但他们真的完全实现了同样的功能吗?答案是不完全是,针对基础类型和基础数组类型他们是几乎相同的,但是对于类的对象类型他们之间是有区别的,new和delete是C++标准的内存分配和释放操作符,可以执行类的构造和析构函数,而使用malloc和free并不会调用构造和析构函数,导致内存分配时没有完全初始化类内部成员变量,内存释放时也会出现导致泄露的可能性,因此在C++中不建议使用malloc和free。
结论:个人觉得C++内存分配和释放机制只不过是对C内存分配和释放机制进行封装,同时加入一些面向对象特性而已。