Скажем, у меня есть функция A () в C ++, и она вызывает другую функцию B (). B () открывает файл и читает длинную строку, а затем возвращает эту строку в A (). Затем A () использует эту строку как входной параметр для C (). C () ожидает ссылку на строку.
Для этого я вижу два решения:
B () получает ссылку на строку как входной параметр (назовите его str). B () редактирует str, поэтому A () получает строку. Освобождение выделенной памяти является обязанностью A (). Когда A () выполняется с использованием строки, она возвращает память системе. Мне это ясно.
B () возвращает строку. Меня смущает этот вариант. Кто тогда освобождает выделенную память? B () создает локальную строку, поэтому не может вернуть ее адрес. B () должен возвращать параметр по значению. Насколько мне известно, благодаря оптимизации возвращаемого значения не создается фактическая копия строки. В фоновом режиме параметр по-прежнему передается по ссылке. Когда я пишу псевдо что-то вроде этого:
A() { C(B(filename)) }
Что будет, чем с выделенной памятью? B () получает имя файла, открывает файл, выделяет блок памяти для строки, которую он читает из файла, а затем возвращает эту строку. Это конец жизненного цикла B (). A () не имеет переменной, определенной для адресации этой строки. Кто отдает обратно этот блок памяти? И можно ли рассчитывать на RVO? Нормально ли, чтобы производительность возвращалась по значению, чем? Есть ли это в каждом компиляторе?
std::string
следует за этим, поэтому память освобождается, когдаstd::string
объект, который ее использовал, выходит за пределы области видимости (или иным образом уничтожается). - person Jason R   schedule 29.01.2015new
) автоматически уничтожаются, а память, необходимая для их хранения, управляется компилятором. - person Benjamin Lindley   schedule 29.01.2015char*
и выделю для него память в B () с помощьюnew
? Потом возвращаю в виде строки? Извините за вопрос о краях, но я не собираюсь решать что-то на данный момент, я пытаюсь понять принцип - person lulijeta   schedule 29.01.2015string B(char *)
на самом деле будетvoid B(string &, char *)
.string
выделяется в стеке вызывающего в соответствии с моим ответом, функция конструирует его с помощьюstring::string(char *)
и возвращает. Тогда у вас, вероятно, будет утечка памяти, если вы не очистите исходныйchar *
. - person Blindy   schedule 29.01.2015std::string
?) Самchar*
обрабатывается компилятором. И строка, созданная изchar*
в операторе возврата, также обрабатывается компилятором. Но память, которую вы выделили с помощьюnew
, не обрабатывается компилятором. У вас будет утечка памяти, если вы сделаете что-то вроде этого:std::string B() { char* p = new char[10]; return p; }
- person Benjamin Lindley   schedule 29.01.2015std::string
), имеют конструкторы и деструкторы копирования / перемещения, которые заботятся об очистке памяти, которую они используют. - person greyfade   schedule 29.01.2015char* buffer = new char[size]
. Тогда, поскольку мое возвращаемое значение является строкой, я верну свой буфер. Когда я возвращаю его, объем функции заканчивается, и я не могу вернуть память. Следовательно утечка памяти. Можно ли читать из файла внутриstring B(string filename)
, а затем возвращать его как строку и при этом не вызывать утечку памяти? - person lulijeta   schedule 29.01.2015new
без связанногоdelete
. Что касается вопроса в конце вашего комментария, да. Конечно, это возможно. Но этот вопрос, вероятно, относится к отдельному посту, а не к разделу комментариев этого поста. - person Benjamin Lindley   schedule 29.01.2015getline()
, чтобы напрямую читать из файлового потока вstring
и обходить глупые промежуточные объекты. - person Blindy   schedule 29.01.2015new
илиmalloc
. Как я уже сказал, задайте еще один вопрос, если хотите знать, как это сделать. - person Benjamin Lindley   schedule 30.01.2015