Очень слабая ссылка (не может быть превращена в общую)

Я хотел бы знать, существует ли какая-либо концепция интеллектуального типа указателя, которая реализует идею «очень слабой ссылки».

Это было бы в основном weak_ptr но это не может быть превращено в shared_ptrв принципе, когда у вас есть very_weak_refs там, вы уверены, что количество сильных ссылок никогда не может увеличиться.

Это позволило бы руководителям лучше владеть памятью, а предоставление очень слабых ссылок в открытом доступе позволило бы клиентам получать доступ к данным, используя старый добрый необработанный указатель через .lock_get() функция или эквивалент … (название предназначено для отражения того, что вы будете делать .lock().get() обычно).

У вас нет такой же защиты данных, потому что ваш объект может быть уничтожен во время его использования, но если ваша среда достаточно управляема, так что вы знаете, что менеджер не может очистить свои данные во время обработки, вы все еще хорошо использовать raw-указатели локально после проверки null_ptr после lock_get(),

Кто-нибудь из вас хотел что-то подобное, больше информации / интеллекта / мыслей по этому поводу?
Благодарю.

обоснование: мотивация заключается в том, что weak_ptr имеет «недостаток безопасности», заключающийся в том, что он может быть передан в общий доступ, и поэтому, после распространения слабых ссылок в дикой природе, вы в основном сделали то же самое, что и распространение общих ссылок, потому что любой может хранить очень долго общие ссылки на ваши данные, эффективно предотвращая правильную очистку объектами. которые должны были быть сильными (менеджер).

Это решается очень слабыми ссылками, когда вы распространяете объекты такого типа в общедоступном интерфейсе вашего менеджера, вы уверены, что при удалении вашей последней общедоступной ссылки ваши данные будут удалены.

Для меня вся концепция слабых ссылок работает только с хорошими клиентами; кто понимает, что они должны продвигать своих слабых рефери в акции в течение лишь небольшого количества времени.

3

Решение

К сожалению, то, что вы просите, невозможно с традиционным интерфейсом умных указателей.

Это вопрос жизни. weak_ptr его нельзя использовать для непосредственного доступа к объекту, поскольку он не гарантирует, что указанный объект проживет достаточно долго: объект может быть извлечен прямо из-под ваших ног.

Пример:

int main() {
std::shared_ptr<int> sp(new int(4));
std::weak_ptr<int> wp(sp);

if (not wp.expired()) {
sp.reset();
std::cout << *wp << "\n"; // Access WP ? But there is nothing there!
}
}

Таким образом, хорошо это или плохо другого выбора нет чем восстановление общего указателя из слабого указателя в любое время, когда вам действительно нужен доступ к объекту без контроля продолжительности этого доступа.


Этот последний момент, однако, является нашей подсказкой. Простая идея состоит в том, чтобы написать хорошо себя ведет клиент weak_ptr сами и измените способ, которым это позволяет внешнему миру получить доступ к данным. Например:

template <typename T>
class very_weak_ptr {
public:
very_weak_ptr() {}

explicit very_weak_ptr(std::weak_ptr<T> wp): _wp(wp) {}

template <typename F>
void apply(F&& f) {
std::shared_ptr<T> sp = _wp.lock();
f(sp.get());
}

private:
std::weak_ptr<T> _wp;
}; // class very_weak_ptr

Примечание: есть еще один недостаток, enable_shared_from_this позволяет восстановить std::shared_ptr<T> с самого примера T; Вы можете добавить проверку времени компиляции на T предотвратить использование этого класса с такими объектами.

1

Другие решения

То, что вы просите, функционально эквивалентно, начиная с std::shared_ptr<>:

  • изначально создавая std::weakptr<> к этому + .get()-Ting необработанный указатель,
  • перед использованием необработанного указателя, проверяя weak_ptr<> не имеет .expired(),

Кто-нибудь из вас хотел что-то подобное, больше информации / интеллекта / мыслей по этому поводу? Благодарю.

Нет … если вам нужно проверить weak_ptr<>.expired() в любом случае, вы могли бы также получить действительный shared_ptr<>, Что вы действительно думаете, что это будет достигать? «Лучшее« сильное владение »», когда вы как-то знаете / требуете, чтобы менеджер не мог освободить объект в течение периода, когда вы используете необработанный указатель — не складывается ….

0

По вопросам рекламы [email protected]