В Studio управления можно поместить число после маркера конца пакета ДВИЖЕНИЯ, чтобы заставить пакет быть повторенным что количество раз:
PRINT 'X'
GO 10
распечатает 'X' 10 раз. Это может сохранить Вас из утомительной копии/вставки при выполнении повторяющегося материала.
То, что вы ищете, - это функция выпуска
; 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; по крайней мере, это дало бы им выбор между двумя. Пользователь должен стать владельцем этого объекта. Я не хочу возвращать Boost.shared_ptr,
shared_ptr
выражает совместное владение , и вы хотите, чтобы ваш интерфейс выражал передачу права собственности. std :: auto_ptr
, таким образом, был бы более применим здесь.
Однако внутри я хотел бы сохранить указатель в shared_ptr, чтобы предотвратить утечку памяти в случае исключений
Опять же, shared_ptr
может быть не лучшим инструментом для этой работы. Для предотвращения утечек в случае исключений лучше подойдет scoped_ptr
или auto_ptr
.
Как хорошо объяснил Джеймс, на самом деле невозможно отсоединить общий указатель.
Вам нужно несколько владельцев внутри, или вы передаете право собственности от вашего класса клиенту? В этом случае std :: auto_ptr
может соответствовать всем требованиям.
Если вас беспокоит неожиданная семантика std :: auto_ptr
, вы можете удерживать его внутри boost :: scoped_ptr
, и отсоедините его в том месте, где вы его передаете, оставив его на усмотрение клиента, чтобы вручную удалить его или сохранить в своем собственном интеллектуальном указателе.
Если у вас есть несколько владельцев. с вашей стороны вы могли бы использовать навязчивый счет. Затем вы можете использовать boost :: intrusive__ptr
внутри, но передать необработанный указатель в интерфейсе. Затем клиент может либо вручную работать со счетчиками ссылок, либо