Это правильно (при условии, что вы имели в виду strcpy
, а не strlen
), но из документации функции должно быть очень ясно, что вызывающая сторона несет ответственность за освобождение возвращаемого указателя, и какой метод он должен сделать используйте для его освобождения (new
=> delete
, new []
=> delete[]
, malloc
=> free
и т. д.). Это «С» способ сделать это.
Это зависит от пользователей вашей функции (включая вас после нескольких месяцев, когда вы ее написали), чтобы прочитать документацию, чтобы все было правильно, так что она довольно подвержена ошибкам; Кроме того, в C ++ есть еще несколько сложностей, которых нет в C (а именно: исключения), которые делают использование необработанных указателей в этих контекстах не очень хорошей идеей.
Это причина, по которой вы обычно должны возвращать классы, которые инкапсулируют ресурсы (например, std::string
в этом случае, и в общем случае контейнеры, которые управляют памятью автоматически) или интеллектуальные указатели, передающие права собственности, которые также имеют преимущество, заключающееся в исключении: безопасно (что ваш код не является).
Звучит крайне сложно, но на самом деле это не так:
#include <string>
std::string func()
{
return "hi"; // actually, to be more explicit it should be return std::string("hi")
}
int main()
{
std::string c;
c=func();
return 1;
}
Вот и все, не нужно беспокоиться о распределении / освобождении и исключениях, все это автоматически обрабатывается классом std::string
, поэтому вы можете управлять строками почти так же, как они были встроенными типами.