Не пытайтесь делать что-либо, что могло бы удалить удержание указателя с помощью const shared_ptr<T>
, например, вызвать на нем reset()
!
Если вы сделаете что-то вроде delete myConstSharedPtr.get();
, будет вызван delete
снова на сохраненный указатель, когда счетчик ссылок достигнет 0, в основном вызывая ошибку двойного освобождения.
Кроме того, вам следует пересмотреть свой дизайн и решить, действительно ли вы хотите использовать shared_ptr
.
В конечном итоге, в качестве крайней меры, если константность этого shared_ptr
исходит от внешней библиотеки, которая не должна накладывать это ограничение const
и которую вы не можете корректно исправить, тогда const_cast
сделано для такой ситуации. Но забудь, ты не хочешь этим пользоваться, правда.
Все еще там? Вот как использовать const_cast
для принудительного сброса const shared_ptr
.
template<typename T>
void forceReset(const std::shared_ptr<T> ptr){
const_cast<std::shared_ptr<T>&>(ptr).reset();
}
ПРЕДУПРЕЖДЕНИЕ. Если этот код делает то, что вы хотите на первый взгляд, это означает, что плохая библиотека, от которой вы зависите, теряет память. В самом деле, отключить a shared_ptr
невозможно, то есть уничтожить его без обновления счетчика ссылок. Это означает, что если один из общих указателей, относящихся к принудительно удаленному ресурсу, не будет выделен динамически и никогда не будет удален до конца программы, произойдет двойное освобождение, что приведет к неопределенному поведению ... вероятно, неприятный взлом sh.
Но если вы все еще хотите продолжить, что вам определенно не следует, вы можете воспользоваться этим, чтобы не дать счетчику ссылок достичь нуля за счет небольшой утечки памяти, которая будет устранена при выходе из программы. , Утечка памяти не приведет к какому-либо неопределенному поведению.
template<typename T>
void forceReset(const std::shared_ptr<T> ptr){
//This leaked shared_ptr will prevent automatic deletion
new std::shared_ptr<T>(ptr);
const_cast<std::shared_ptr<T>&>(ptr).reset();
}
Еще один отказ от ответственности: я настоятельно рекомендую всем использовать этот хак. Я дал это, чтобы обсудить риск возиться с умными указателями и const_cast
. Пожалуйста, подумайте еще раз об исправлении поврежденной библиотеки или использовании другой.