• 内存管理运算符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是库函数,不是运算符,所以只是分配内存。

  • 相关阅读:
    pandas取值
    pandas 基本操作
    Pandas三个数据结构
    pandas.Series
    scipy线性模块liner(linalg)
    numpy meshgrid函数
    scipy插值interpolation
    scipy优化器optimizer
    scipy积分 integral
    8086汇编 Loop 指令
  • 原文地址:https://www.cnblogs.com/cplinux/p/5667877.html
Copyright © 2020-2023  润新知