• 条款16:成对使用 new 和delete时要采用相同形式


    1、使用new和delete时有哪些形式?

    new和delete分别有两种形式:

    (1)对象数组:
    type*x = new array[];
    delete [] array;
    
    (2)单一对象:
    type*x = new singleObject;
    delete singleObject;
    

    2、使用new和delete分别做了什么?

    (1)使用new时,有两件事发生:
    • 内存被分配出来(通过 aperator new( )函数。)
    • 指针此内存会有一个(或多个)构造函数被调用。
    (2)使用delete时,有两件事会发生:
    • 有一个(或多个)析构函数被调用。
    • 内存被释放。(通过operator delete( ) 函数。)

    3、new 单一对象、数组对象的区别是有哪些?

    二者的内存布局不同,数组对象中多了一个记录对象个数的变量。new时 ,加上[],便意味着这是一个对象数组,因此该对象数组中会多出一个记录对象个数的变量。
    delete也是同样的

    4、错误的使用不匹配的new、delete可能导致的问题?

    (1)对new的单一对象使用: delete[] single_object;

    导致较少的析构函数被调用,内存没有完全被释放,导致内存泄露。

    (2)或者对对象数组使用:delete array;

    会把它的前一段内存当做记录对象数组中大小的成员变量,导致不确定行为。

    注意: 在自定义的含有指向动态内存的指针时,要确保多个构造函数的每一个构造函数使用统一形式的new,这样才能确保析构函数与统一的new形式匹配。

    5、new与typedef的注意事项

    如果将一个数组进行typedef,那么在进行new 的时候,new 的实际上就是一个对象数组,因此delete时,也应该delete对象数组。

    如下例:

    typedef std::string AddressLines[4]; // 每个人的地址有4 行,每行是一个string  
    //AddressLines 是一个数组。
    std: :string *pal = new AddressLines; // 注意, "new AddressLines" 返回一个string *,就像"new string[4]" 一样。 
    
    delete pal;   // 行为未有定义!  
    delete [] pal;// 很好!  
    

    为了避免上述情况(delete pal; )发生,最好不要typedef数组。这也和容易实现,使用string、vector 的template 取代即可。

  • 相关阅读:
    《一个人的村庄》 ——刘亮程
    uva 11020
    Codeforces Round #190 (Div. 2) B. Ciel and Flowers
    hdu3308 线段树——区间合并
    线段树,区间更新
    vim 被墙
    ubuntu12.04 修复Grub2
    windows下mysql数据库忘记密码
    高性能的异步爬虫
    中间件
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764180.html
Copyright © 2020-2023  润新知