Отсоединить указатель от shared_ptr? [дубликат]

В Studio управления можно поместить число после маркера конца пакета ДВИЖЕНИЯ, чтобы заставить пакет быть повторенным что количество раз:

PRINT 'X'
GO 10

распечатает 'X' 10 раз. Это может сохранить Вас из утомительной копии/вставки при выполнении повторяющегося материала.

28
задан Community 23 May 2017 в 11:55
поделиться

3 ответа

То, что вы ищете, - это функция выпуска ; shared_ptr не имеет функции выпуска. Согласно руководству по ускорению :

Q. Почему shared_ptr не предоставляет функцию release ()?

A. shared_ptr не может передать право владения, если он не является unique (), потому что другая копия все равно уничтожит объект.

Учтите:

shared_ptr<int> a(new int);
shared_ptr<int> b(a); // a.use_count() == b.use_count() == 2

int * p = a.release();

// Who owns p now? b will still call delete on it in its destructor.

Кроме того, указатель, возвращаемый release (), будет трудно надежно освободить, поскольку исходный shared_ptr мог иметь был создан с помощью специального средства удаления.

Вы можете рассмотреть два варианта:

  • Вы можете использовать std :: tr1 :: shared_ptr , что потребует от ваших пользователей использования реализации библиотеки C ++, поддерживающей TR1 или для использования Boost; по крайней мере, это дало бы им выбор между двумя.
26
ответ дан 28 November 2019 в 02:48
поделиться

Пользователь должен стать владельцем этого объекта. Я не хочу возвращать Boost.shared_ptr,

shared_ptr выражает совместное владение , и вы хотите, чтобы ваш интерфейс выражал передачу права собственности. std :: auto_ptr , таким образом, был бы более применим здесь.

Однако внутри я хотел бы сохранить указатель в shared_ptr, чтобы предотвратить утечку памяти в случае исключений

Опять же, shared_ptr может быть не лучшим инструментом для этой работы. Для предотвращения утечек в случае исключений лучше подойдет scoped_ptr или auto_ptr .

11
ответ дан 28 November 2019 в 02:48
поделиться

Как хорошо объяснил Джеймс, на самом деле невозможно отсоединить общий указатель.

Вам нужно несколько владельцев внутри, или вы передаете право собственности от вашего класса клиенту? В этом случае std :: auto_ptr может соответствовать всем требованиям.

Если вас беспокоит неожиданная семантика std :: auto_ptr , вы можете удерживать его внутри boost :: scoped_ptr , и отсоедините его в том месте, где вы его передаете, оставив его на усмотрение клиента, чтобы вручную удалить его или сохранить в своем собственном интеллектуальном указателе.

Если у вас есть несколько владельцев. с вашей стороны вы могли бы использовать навязчивый счет. Затем вы можете использовать boost :: intrusive__ptr внутри, но передать необработанный указатель в интерфейсе. Затем клиент может либо вручную работать со счетчиками ссылок, либо

2
ответ дан 28 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: