Я могу понять, что boost::shared_ptr
не проверяет для NULL
перед вызовом пользовательской функции удаления, но как я могу это достичь? Это поможет мне избежать написания немых оберток для fclose
или любой функции, которая не (правильно) определяет поведение.boost smart pointer with custom deleter
My boost: #define BOOST_VERSION 104500
. Это не C++ 11 (так как я использую boost).
вопрос связан с: make shared_ptr not use delete
Sample Код:
static inline
FILE* safe_fopen(const char* filename, const char* mode)
{
FILE* file = NULL;
(void)fopen_s(&file, filename, mode);
return file;
}
static inline
void safe_fclose(FILE* file)
{
if (file)
BOOST_VERIFY(0 == fclose(file));
}
...
boost::shared_ptr<FILE> file(safe_fopen(FILE_DOWNLOAD, "rb"), safe_fclose);
...
// now it is created => open it once again
file.reset(safe_fopen(FILE_DOWNLOAD, "rb"), safe_fclose);
EDIT
Мой вопрос первоначально имел вторую часть, касающуюся использования shared_ptr
: почему обеспечивающего Deleter как параметр функции вместо параметра шаблона? Видимо, ответ здесь: Why does unique_ptr take two template parameters when shared_ptr only takes one? Ответ на C++ 11 is unique_ptr, но почему boost не обеспечил один - мы никогда не узнаем.
Второй вопрос очень глубок и необходим для дизайна 'shared_ptr'. Я рекомендую переместить отдельный вопрос (который предположительно мы можем закрыть как дубликат). –
Я бы предложил посмотреть [std :: shared_ptr] (http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr), если это возможно. – user3159253
@ Kerrek SB Если я сам переведу его, не стал бы первым вопросом (слева) слишком глупым? Я уже сосредоточил всю свою энергию на этом: p – Liviu