Есть ли способ освободить память, выделенную get_data()
?
Нет, вы потеряли указатель на нее.
Будет ли комментарийfree(data.c_str());
Работа?
Нет.std::string
скопировал ваши данные в новую строку, которой он владеет и управляет.Вы не можете юридически отменить выделение выделенной памяти std::string
, и это не решило бы проблему необходимости отменить выделение вашей выделенной памяти.
Либо использовать std::string
повсюду (предпочтительно!)или захватите указатель внутри main
first:
int main()
{
auto cstr = get_data(...);
std::string data(cstr);
free(cstr);
}
Проблема в том, что это не исключение для исключительных ситуаций, поэтому у нас есть такие замечательные вещи, как std::string
.Это может быть решено с некоторыми либеральными try
и catch
, но это будет некрасиво.
Кроме того, так как у вас уже есть get_data
, предположительно по причине, вы можете рассмотреть string_view
болеефактическая память, которую вы уже распределили, если вам действительно не нужно, чтобы data
была копией-владельцем.
int main()
{
auto cstr = get_data(...);
std::string_view data(cstr); // no copy! just features
free(cstr);
}
(комментарии в других местах указывают, что это может быть тем, что вы действительно хотели).
Теперь поэкспериментируйте с тем, чтобы get_data
вернул что-то с четкой собственностью и семантикой жизни (std::unique_ptr
? std::vector
? std::string
? .. lol), и вы золотой.