zoukankan      html  css  js  c++  java
  • C++中malloc/free和new/delete 的使用

    malloc/free 的使用要点

    函数malloc的原型如下:

    void * malloc(size_t size);


    用malloc申请一块长度为length的整数类型的内存,程序如下:

    int *p = (int *) malloc(sizeof(int) * length);


    我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。

    * malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。

    * malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我们通常记不住int, float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。最好用以下程序作一次测试:

    cout << sizeof(char) << endl;
    cout << sizeof(int) << endl;
    cout << sizeof(unsigned int) << endl;
    cout << sizeof(long) << endl;
    cout << sizeof(unsigned long) << endl;
    cout << sizeof(float) << endl;
    cout << sizeof(double) << endl;
    cout << sizeof(void *) << endl;


    在malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出 p = malloc(sizeof(p))这样的程序来。

    * 函数free的原型如下:

    void free( void * memblock );


    为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

    new/delete 的使用要点

    运算符new使用起来要比函数malloc简单得多,例如:

    int *p1 = (int *)malloc(sizeof(int) * length);
    int *p2 = new int[length];


    这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。例如

    class Obj
    {
    public :
    Obj(void); // 无参数的构造函数
    Obj(int x); // 带一个参数的构造函数

    }
    void Test(void)
    {
    Obj *a = new Obj;
    Obj *b = new Obj(1); // 初值为1

    delete a;
    delete b;
    }


    如果 用new创建对象数组,那么只能使用对象的无参数构造函数。例如

    Obj *objects = new Obj[100]; // 创建100个动态对象


    不能写成

    Obj *objects = new Obj[100](1);// 创建100个动态对象的同时赋初值1


    在用delete释放对象数组时,留意不要丢了符号‘[]’。例如

    delete []objects; // 正确的用法
    delete objects; // 错误的用法


    后者相当于delete objects[0],漏掉了另外99个对象。

  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3341542.html
Copyright © 2011-2022 走看看