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(operator new( sizeof(T) ));

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

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

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

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


你可能感兴趣的:(allocation,delete,编译器,class)