2

这些版本的newdelete是否异常安全?有什么可能的陷阱吗?

假设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);
};
4

2 回答 2

2

这(充其量)是多余的:

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

如果customized_allocator_type满足标准库分配器要求,那么如果无法获得存储,它必须引发异常。返回 null fromallocate是不正确的。

于 2011-03-27T07:49:11.817 回答
1

如果customized_allocator_type 的construct() 函数的行为已知它不会在异常时释放内存,那么您的解决方案是好的。

注意:customized_delete() 检查空指针有一个错字 - 它应该是:

if (ptr == 0)
  return;
于 2011-03-27T07:35:41.037 回答