Будет ли возвращено выделение кучи из myAllo ()?
Нет.Аргумент myChar
передается по значению myAllo()
, поэтому вы просто изменяете локальную копию указателя, а не значение указателя в контексте вызывающего.
память, указанная myChar, будет освобождена, когда myAllo вернется.
Снова нет.Функция пропускает выделенную память при выходе.Чтобы освободить память, вам нужно вызвать delete[]
для указателя, возвращаемого new[]
, но этот указатель выходит из области видимости при выходе из функции.
Существует несколько способов исправить вашу проблему.
Пусть вызывающий передаст адрес указателя, который будет указывать на выделенную память, теперь вы можете изменить то, на что указывает указатель вызывающего.
void myAllo(int mySize, char **myChar )
{
*myChar = new char[mySize];
}
Аналогично, ваша функция может приниматьизменяемая ссылка на указатель
void myAllo(int mySize, char *& myChar )
{
myChar = new char[mySize];
}
Возвращает указатель на выделенную память
char *myAllo( int mySize )
{
return new char[mySize];
}
Лучше, чем все вышеперечисленные решения, вместо возврата необработанных указателей, вернуть умный указатель
std::unique_ptr<char[]> myAllo( int mySize )
{
return std::unique_ptr<char[]>( new char[mySize] );
}