• Item 37. 数组分配(Array Allocation)


    Item 37. Array Allocation

    分配内存时用new,则释放时用delete; 分配时用new[],则释放时用delete[]。
    T *aT = new T; // non-array
    T *aryT = new T[12]; // array
    delete [] aryT; // array
    delete aT; // non-array

    ----------------------------------------------------
    1、why?为什么需要成对使用?
    分配数组和非数组时,使用的操作符不一样,对应的释放操作也不一样。
    void *operator new( size_t ) throw( bad_alloc ); // operator new
    void *operator new[]( size_t ) throw( bad_alloc ); // array new
    void operator delete( void * ) throw(); // operator delete
    void operator delete[]( void * ) throw(); // array delete

    2、当一个类只写了new和delete时,对该类进行数组分配时,调要的分配和释放操作函数是两个那个全局的::operator new[] 和::operator delete[]。
    因此为了确保分配行为的一致,同时声明数组和非数组的分配释放操作是个不错的选择。
    class Handle {
      public:
        //...
        void *operator new( size_t );
        void operator delete( void * );
        void *operator new[]( size_t n )
            { return ::operator new( n ); }
        void operator delete[]( void *p )
            { ::operator delete( p ); }
        //...
    };

    3、参数size_t是如何传入的?
    隐式调用operator new时,编译器作了手脚:
    aT = new T; // calls operator new( sizeof(T) );
    而我们也可以直接调用operator new :
    aT = static_cast<T *>(operator new( sizeof(T) ));

    对于数组:
    aryT = static_cast<T *>(operator new[]( 5*sizeof(T) ));

    4、隐式调用operator new[],发生了什么?

    隐式调用operator new[]时,编译器通常多分配了一点内存+delta :
    aryT = new T[5]; // request 5*sizeof(T) + delta bytes

    5、额外内存的用途:
    用来运行时内存的管理,它记录了释放内存时需要的数组信息(分配元素的数目,每个元素的大小等)。


  • 相关阅读:
    js发送请求
    GIS小知识
    oracle常见错误
    java异常Exception
    java获取文件路径
    Runnable和Thread的区别
    Hadoop shell命令
    Runtime和Process
    Linux下查看tomcat控制台输出信息
    ajax小知识
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333208.html
Copyright © 2020-2023  润新知