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);
};
答案 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;