2011-03-27 59 views
2

這些版本是刪除是異常安全嗎?任何可能的陷阱?使用分配器

假設customized_allocator_type是STL兼容的。還假定分配器的構造函數沒有任何副作用,並且所有實例都是等價的。

在此先感謝您的意見!

template <typename T> 
inline T * customized_new(const T& t) 
{ 
    customized_allocator_type<T> alloc; 
    T * ptr = alloc.allocate(1); 

    if (ptr==0) 
     throw std::bad_alloc(); 

    try { 
     alloc.construct(ptr, t); 
    } catch (...) { 
     alloc.deallocate(ptr, 1); 
     throw; 
    } 

    return ptr; 
} 


template <typename T> 
inline void customized_delete(T * ptr) 
{ 
    if (ptr==0) 
     return; 

    customized_allocator_type<T> alloc; 
    alloc.destroy(ptr); 
    alloc.deallocate(ptr, 1); 
}; 

回答

2

這是(最好)冗餘:

if (ptr==0) 
    throw std::bad_alloc(); 

如果customized_allocator_type被滿足標準庫分配器要求,那麼如果無法獲得存儲,它必須引發異常。從allocate返回null將不正確。

+0

同意。符合STL的分配器不應該返回null。我將你的答案標記爲已接受。謝謝。 – pic11 2011-03-27 08:14:10

1

如果()函數是已知的,它不釋放在異常內存customized_allocator_type的結構的行爲,那麼您的解決方案是好的。

注:有在customized_delete()錯字檢查空指針 - 它應該是:

if (ptr == 0) 
    return; 
+0

好抓!謝謝。 – pic11 2011-03-27 08:12:39