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

  • 相关阅读:
    redis 键命令
    redis 数据类型
    java向word写入数据
    Eclipse发布到tomcat提示java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    Unable to locate Spring NamespaceHandler for XMLschemanamespace http://dubbo.apache.org/schema/dubbo
    5.Dubbo之Spring XML配置
    6.Dubbo之XML配置详解。
    7.Dubbo之最佳实践
    RESTful API实践
    Jav程序执行Linux命令
  • 原文地址:https://www.cnblogs.com/cplinux/p/5667877.html
Copyright © 2011-2022 走看看