2010-11-24 2 views
2

Я создаю gui api для игр. У меня есть, например, шрифт для каждого виджета в виде шрифта *. Прямо сейчас у меня это так, что я никогда не управляю памятью (по понятным причинам), потому что я думаю, что пользователь может использовать интеллектуальные указатели, если они хотят, чтобы эта память управлялась. Согласие на это в том, что оно не очень идиотское доказательство. Если пользователь установил шрифт следующим образом:При прохождении указателей на класс, кому нужно управлять ресурсами?

obj.setFont(new Font("")); 

Это немедленно вызовет утечку памяти, потому что никто никогда не освобождает ее. Единственный способ - удалить getFont();

Было бы лучше для меня управлять ими?

Благодаря

+1

При необходимости укажите аргументы на константу-ссылку, используйте интеллектуальные указатели в другом месте, определите, какой экземпляр владеет тем, что другие экземпляры (т. Е. Определяет срок жизни объекта). – gimpf 2010-11-24 15:49:11

+2

Вы не можете нести ответственность за кого-то, набрав это: `obj.setFont (новый Font (" "));` больше, чем вы можете нести ответственность за то, что кто-то печатает новый шрифт (""); `на линии сам по себе , – 2010-11-24 15:56:23

ответ

2

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

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

+0

Ссылка на указатель? – jmasterx 2010-11-24 15:53:25

1

Это проблема с переданным правом собственности.

Но: Вы можете переписать интерфейс

void obj.setFont(SmartPtr<Font> font); 

, потому что тогда вы вынуждаете пользователю использовать смарт-указатель.

3

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

  • В C++ 03, хороший способ, чтобы сделать его явным, что вы на самом деле берут на себя ответственность, чтобы получить параметр как std::auto_ptr: клиент будет иметь никаких сомнений в том, что он с передачей прав собственности
  • На противоположном , получение параметра через ссылку const должно дать понять, что у вас нет намерения когда-либо удалять данные (вы не можете знать, действительно ли оно было на первом месте).

В любом случае, поиск умных указателей, вероятно, поможет в решении этих вопросов.

Смежные вопросы