Член моего класса является boost::scoped_ptr
который установлен в (T*)0
когда объект создан. В классе есть init()
метод, который фактически инициализирует умный указатель с новым объектом.
Однако, если выдается исключение до у того умного указателя есть допустимая ссылка, он очень неосмотрительно пытается удалить нуль (выпуск) или утверждает (отладка).
Как заставить его игнорировать нулевые указатели при уничтожении без изменения исходного исходного кода; и, если это невозможно, существует ли более подходящий альтернативный класс интеллектуальных указателей?
boost :: scoped_ptr фактически игнорирует нулевые указатели в своем деструкторе. boost :: scoped_ptr использует boost :: checked_delete () для удаления. boost :: checked_delete () использует обычный delete
чтобы удалить (boost :: checked_delete () также проверяет, чтобы T не был неполным).
И вы можете удалить нулевые указатели с удалением (в отличие от free()
). Вы уверены, что ошибка действительно в boost :: scoped_ptr?
Ты можешь попробовать std::unique_ptr
вместо boost::scoped_ptr
и предоставить пользовательскую функцию удаления, которая будет проверять состояние базового объекта — см. http://en.cppreference.com/w/cpp/memory/unique_ptr.