Это правильно (предполагается, что вы имели в виду 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;
}
Вот так, не нужно беспокоиться о выделенных/deallocations и исключения, все это автоматически обрабатываются std::string
класса, так что вы можете управлять почти так же, как они были построены.
правильно, в каком смысле? –
@Alecs Вы не использовали функцию 'strlen' правильно – Pradeep
ли данные в памяти, выделенные в локальной функции, остаются нетронутыми, когда мы выйдем из локальной функции? – Alecs