Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用分配器_C++_Allocator - Fatal编程技术网

C++ 使用分配器

C++ 使用分配器,c++,allocator,C++,Allocator,这些版本的新建和删除是否异常安全?有什么可能的陷阱吗 假设定制的\u分配器\u类型与STL兼容。还假设分配器的构造函数没有任何副作用,并且所有实例都是等效的 提前感谢您的输入 template <typename T> inline T * customized_new(const T& t) { customized_allocator_type<T> alloc; T * ptr = alloc.allocate(1); if (pt

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

假设定制的\u分配器\u类型与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);
};
模板
内联T*自定义_新(常数T&T)
{
自定义分配程序类型alloc;
T*ptr=alloc.allocate(1);
如果(ptr==0)
抛出std::bad_alloc();
试一试{
分配构造(ptr,t);
}捕获(…){
分配解除分配(ptr,1);
投掷;
}
返回ptr;
}
模板
内联作废自定义删除(T*ptr)
{
如果(ptr==0)
返回;
自定义分配程序类型alloc;
分配破坏(ptr);
分配解除分配(ptr,1);
};

如果定制的\u分配器\u type的construct()函数的行为已知它不会在异常时释放内存,那么您的解决方案是好的

注意:空指针的自定义_delete()检查中有一个输入错误-应该是:

if (ptr == 0)
  return;
这(充其量)是多余的:

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

如果
customized\u allocator\u type
满足标准库分配器要求,则如果无法获得存储,则必须引发异常。从
allocate
返回null是不正确的。

同意。符合STL的分配器不应返回null。我认为你的回答已被接受。谢谢