Увеличьте scoped_ptr / scoped_array с помощью специального средства удаления - PullRequest
7 голосов
/ 15 апреля 2011

Я не вижу, как получить scoped_ptr или scoped_array для использования пользовательского средства удаления. Может быть, есть другая реализация, которая позволяет контролируемое удаление, подобное shared_ptr ?

Кстати, почему shared_ptr разрешает пользовательское удаление, а scoped_ptr - нет? Просто любопытно.

Ответы [ 4 ]

5 голосов
/ 16 апреля 2011

Я не вижу, как заставить scoped_ptr или scoped_array использовать пользовательское средство удаления

Вы не можете.

Может быть, есть другая реализация, которая позволяет контролируемое удаление, подобное shared_ptr?

Если ваш компилятор поддерживает ссылки на rvalue, а ваша реализация Стандартной библиотеки реализует std::unique_ptr, вы можете использовать это.

В противном случае реализация boost::scoped_ptr очень проста. Последняя версия - это менее 100 строк простого кода. Было бы довольно просто создать свой собственный производный, который имеет пользовательский удалитель (статический через параметр шаблона или динамический через функцию или функтор, предоставляемый во время выполнения).

3 голосов
/ 27 декабря 2014

Вы можете перегрузить функцию boost :: checked_delete, например,

namespace boost {

template<>
void checked_delete (Foo* x)
{
    ....
}

} // namespace boost

После перегрузки scoped_ptr будет вызывать check_delete, а не удалять.

3 голосов
/ 16 апреля 2011

scoped_ptr не разрешает пользовательское удаление. Основная причина, которую я могу предположить, заключается в том, что ее размер не будет равен sizeof(T*), если он будет сохранять boost::function<>, как shared_ptr.

Я думаю, что наиболее переносимые варианты - использовать shared_ptr или написать свой собственный scoped_ptr, который будет поддерживать удалители.

1 голос
/ 16 апреля 2011

Другая реализация указателя области действия и массива области действия найдена в Qt

http://doc.qt.io/qt-5/qscopedpointer.html

Это позволяет для пользовательского удаления.

...