Возвращение указателей из класса. Кто несет ответственность за удаление? - PullRequest
4 голосов
/ 01 марта 2012

У меня есть класс C ++, который реализует двоичный совместимый интерфейс (для использования в качестве разделяемой библиотеки), возвращая, таким образом, только типы C.Строки в виде const char *, указатели void и указатели на другие классы с двоичным интерфейсом.Вопрос в том, как организовать управление памятью, вернуть ли постоянные указатели на данные существующего класса (опасность использования устаревшего указателя пользователем), и освободить там память самостоятельно, точнее, указатели на некоторые переменные кучи и сделать пользователя ответственным за удаление этих указателей.позже или ???Существуют ли общие рекомендации для этого?

Ответы [ 7 ]

5 голосов
/ 01 марта 2012

В «двоичном совместимом интерфейсе», используя интерфейс C, вы не принимаете общую кучу.Следовательно, сторона, которая выделяет память из кучи, является стороной, которая возвращает ее в эту кучу.

Вы можете получить впечатляющие сбои и / или повреждение без вывода сообщений, если выделите блок из одной кучи, передадите его через интерфейс C, а затем получите другую сторону delete.

1 голос
/ 01 марта 2012

Это действительно ваше дело.

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

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

Это делается в обоих направлениях.,Здесь нет никаких сложных и быстрых правил.

1 голос
/ 01 марта 2012

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

1 голос
/ 01 марта 2012

Возложить на вызывающего абонента ответственность за выделение и освобождение памяти.

0 голосов
/ 01 марта 2012

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

0 голосов
/ 01 марта 2012

Я бы сказал, что вызывающая сторона несет ответственность за освобождение данных. Также обратите внимание, что вы не можете использовать new, если вызывающая сторона не является приложением C ++.

0 голосов
/ 01 марта 2012

Если это возможно, используйте умные указатели, такие как unique_ptr или shared_ptr. (Что не должно быть проблемой, поскольку вы уже оборачиваете функции C, если я вас правильно понял.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...