Я в процессе переноса некоторого кода с Objective C на C ++.Я не так хорошо знаком с шаблонами проектирования C ++, как с Objective C. В мире Какао существует очень распространенный шаблон написания фабричного метода, который возвращает «автоматически выпущенный» объект.Что-то простое:
- (MyClass *)load {
MyClass* obj = [[MyClass alloc] init];
return [obj autorelease];
}
Это просто и легко понять.Метод владеет памятью, которую он выделяет, но может передать ее вызывающей стороне, одновременно отказываясь от владения.Это не должно знать или заботиться, что звонящий делает с той памятью.Если он сохранит его, объект выживет.Если он полностью игнорируется, память будет освобождена через некоторое время после того, как текущий стек вызовов будет размотан.
Я подхожу к этому с некоторым трепетом в C ++, потому что его не пересчитанная среда, кажется, не имеетчто-нибудь столь же чистое, как autorelease
, или любой вид политики владения, который так же хорошо определен, как и в платформах Какао.Каковы лучшие практики для такого типа паттернов в C ++?
Я знаю об auto_ptr, но есть и множество проблем с его использованием, и, похоже, слишком много недостатков, чтобы быть столь же повсеместным, какautorelease
(странная семантика копирования, отсутствие поддержки массивов, несовместимость с контейнерами STL и т. Д.).
Интеллектуальные указатели повышения также являются очевидным кандидатом, а некоторые даже реализуют собственный подсчет ссылок.Хотя мне немного странно полагаться на стороннюю библиотеку для чего-то такого обыденного.
Другой вариант, который пахнет C, - просто , а не освобождает возвращенную память,но при помощи общепринятого соглашения об именовании укажите, что вызывающий объект теперь владеет возвращаемым объектом.Это кажется немного архаичным и склонно к невидимым утечкам, если вызывающая сторона случайно проигнорирует возвращаемое значение.