使用分配器

时间:2011-03-27 06:25:42

标签: c++ allocator

new delete 的这些版本是否安全?任何可能的陷阱?

假设 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 个答案:

答案 0 :(得分:2)

这是(充其量)多余的:

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

如果customized_allocator_type符合标准库分配器要求,则必须在无法获取存储时引发异常。从allocate返回null是不正确的。

答案 1 :(得分:1)

如果已知custom_allocator_type的construct()函数的行为在异常时没有释放内存,那么你的解决方案就是好的。

注意:custom_delete()中有一个拼写检查空指针 - 它应该是:

if (ptr == 0)
  return;