内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。
(1)内存管理函数与内存管理运算符的区别
内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free。
内存管理运算符有new 和delete.
两种内存管理方式的最大区别就是malloc以及free等内存管理函数是库函数,不在编译器的控制 范围之内。并且在创建对象实例时,malloc只是负责内存的分配,并没有对分配的内存调用构造函数以及初始化。malloc分配的内存时void类型的内存,需要做相应的内存转换。
而内存管理运算符(new delete)完成了两个动作,第一 就是为对象分配内存,第二 为分配的对象内存调用构造函数初始化。
1 #include"D:\programmer practice\thinking in c++\require.h" 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 6 using namespace std; 7 8 class Obj{ 9 int i, j, k; 10 enum{sz=100}; 11 char buf[sz]; 12 public: 13 Obj(){ 14 cout << "Obj()" << endl; 15 } 16 ~Obj(){ 17 cout << "~Obj()" << endl; 18 } 19 void initialize(){ 20 cout << "initialize()" << endl; 21 i = j = k = 0; 22 memset(buf,0,sz); 23 } 24 25 void destory()const{ 26 cout << "destory()" << endl; 27 } 28 29 }; 30 31 int main(){ 32 Obj* objPtr = (Obj*)malloc(sizeof(Obj));//malloc只是分配了一块内存,而不是生成一个对象 33 //所以malloc返回的是一个void* 类型的指针。我们知道c++是强类型语言 34 //它不允许将一个void*类型指针赋予任何其他类型的指针,所以要做类型转换 35 require(objPtr!=0); 36 37 objPtr->initialize();//malloc只负责分配内存,不负责初始化,所以并没有调用类的构造函数。所以需要我们自己手动初始化对象。 38 39 objPtr->destory();//也不会调用构造含糊的析构函数,同样销毁对象也需要我们自己手动进行。 40 free(objPtr); 41 }
上面的运行结果,在我们用malloc为Obj类的对象分配内存时,并没有调用构造函数,在程序结束后也没有调用析构函数。就是因为malloc只是分配内存。
下面我们把main 函数内的代码修改一下
1 int main(){ 2 Obj* objPtr = new Obj; 3 delete objPtr; 4 return 0; 5 }
上面的运行结果就会发现,在用new运算符创建对象时,就对分配的对象内存进行了初始化(调用构造函数)。
总结如下:
new 运算符在创建对象时,第一步是为对象分配内存,第二步是为分配的对象内存调用构造函数。
delete运算符在销毁对象时,第一步是调用析构函数,第二步是把对象内存释放。
malloc是库函数,不是运算符,所以只是分配内存。