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 を返すのallocateは正しくありません。

于 2011-03-27T07:49:11.817 に答える
1

Customized_allocator_type の construct() 関数の動作が例外でメモリの割り当てを解除しないことがわかっている場合、ソリューションは適切です。

注:customized_delete() の null ポインターのチェックにタイプミスがあります。次のようにする必要があります。

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