Использование распределителей - PullRequest
2 голосов
/ 27 марта 2011

Эти версии new и delete безопасны от исключений?Любые возможные подводные камни?

Предположим, что custom_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 ]

2 голосов
/ 27 марта 2011

Это (в лучшем случае) избыточно:

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

Если customized_allocator_type удовлетворяет требованиям стандартного распределителя библиотек, оно должно вызвать исключение, если хранилище не может быть получено. Возвращение нуля из allocate было бы неверным.

1 голос
/ 27 марта 2011

Если известно, что поведение функции construct () custom_allocator_type известно, что она не освобождает память при исключении, тогда ваше решение хорошо.

Примечание.указатель - должно быть:

if (ptr == 0)
  return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...