内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。

(1)内存管理函数与内存管理运算符的区别

内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free。

内存管理运算符有new 和delete.

两种内存管理方式的最大区别就是malloc以及free等内存管理函数是库函数,不在编译器的控制 范围之内。并且在创建对象实例时,malloc只是负责内存的分配,并没有对分配的内存调用构造函数以及初始化。malloc分配的内存时void类型的内存,需要做相应的内存转换。

而内存管理运算符(new delete)完成了两个动作,第一 就是为对象分配内存,第二  为分配的对象内存调用构造函数初始化。

 1 #include"D:programmer practice	hinking in c++
equire.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是库函数,不是运算符,所以只是分配内存。

原文地址:https://www.cnblogs.com/cplinux/p/5667877.html