eerorika ответ правильный, но может быть расширен.
Тогда память распределяется локально, тогда эта функция отвечает за ее освобождение.
Если вы вернете его, то возьмете на себя эту ответственность, и это опасно. У вас будет та же проблема, что и в вашей функции, но в другом месте:
char* toNormalWord(const std::string& src);
void processString(const std::string& src)
{
char* des = toNormalWord(src);
/* ... */
if (c == '\n') throw new std::exception("invalid character!"); //memory leak of `des`!
/* ... */
return; //memory leak of `des`!
}
Теперь ваша память теперь локальна для других функций, и она должна быть там свободной.
Вероятно, лучший способ избежать всего этого - использовать std::unique_ptr<char[]>
:
std::unique_ptr<char[]> toNormalWord(const std::string& src)
{
std::unique_ptr<char[]> des(new char[src.size() + 1]);
/* ... */
return des;
}
void processString(const std::string& src)
{
std::unique_ptr<char[]> des = toNormalWord(src);
/* ... */
if (c == '\n') throw new std::exception("invalid character!"); //no memory leak!
/* ... */
return; //no memory leak!
}
с этим компилятором всегда будет помнить освободить эту память.
В этом конкретном случае вы можете использовать std::string
, как предложено Барри . В некоторых случаях я даже использовал std::vecotr
для строк. Все это зависит от того, как используется эта «память».
std::string
лучше всего, когда вам нужно выполнить много строковых операций, таких как конкатенация.