Общий указатель может быть общим для многих, но вы не можете просто так его отнять. Это разработано Артём и peoro .
Одним из подходов является создание временного auto_ptr
и освобождение его от обработки указателя в конце области. dalle описывает первый подход, но он страдает от отсутствия безопасности исключений (может случайно удалить), и он не может защитить вас от случайной передачи его функции, которая собирается передать право собственности (где удаление удаляется наших рук).
Мы можем сделать нашу собственную обертку, чтобы избежать этого, хотя:
template <typename T>
class auto_ptr_facade
{
public:
auto_ptr_facade(shared_ptr<T> ptr) :
mPtr(ptr),
mAuto(ptr.get())
{}
~auto_ptr_facade()
{
// doesn't actually have ownership
mAuto.release();
}
// only expose as const, cannot be transferred
const auto_ptr<T>& get() const
{
return mAuto;
}
operator const auto_ptr<T>&() const
{
return get();
}
private:
auto_ptr_facade(const auto_ptr_facade&);
auto_ptr_facade& operator=(const auto_ptr_facade&);
shared_ptr<T> mPtr;
auto_ptr<T> mAuto;
};
Теперь вы можете рассматривать shared_ptr
как const auto_ptr
в области видимости:
template <typename T>
void foo(shared_ptr<T> ptr)
{
auto_ptr_facade<T> a(ptr);
// use a
}