выделение кучи возвращается из функции - PullRequest
2 голосов
/ 18 октября 2011
The function has a problem: 

void myAllo(int mySize, char *myChar )
{
    myChar = new char[mySize];
}

Будет ли выделена куча из myAllo()? Я так не думаю, потому что память, указанная myChar, будет быть освобожденным, когда myAllo возвращается.

Верно?

Любые комментарии приветствуются.

Спасибо

Ответы [ 4 ]

8 голосов
/ 18 октября 2011

Будет ли возвращено выделение кучи из 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] );
}
2 голосов
/ 18 октября 2011

Чтобы получить выделенную память, вам нужно написать функцию как

void myAllo(int mySize, char **myChar )
{
    *myChar = new char[mySize];
}

и назовите его

char* pointer;
myAllo(size, &pointer);

или как

char* myAllo(int mySize )
{
    return new char[mySize];
}

и назовите это

char* pointer = myAllo(size);
2 голосов
/ 18 октября 2011

Будет ли выделена куча из myAllo ()?

No.

память, указанная myChar, будет освобождена, когда myAllo вернется.*

Нет, это утечка памяти.

1 голос
/ 18 октября 2011
void myAllo(int mySize, char *myChar ) 
{   //note: myChar is a COPY of someone else's pointer 
    myChar = new char[mySize];
    //nobody outside of the function will ever see this change
}

Динамическая память (новая) освобождается только при явном ее освобождении.
myChar выходит за рамки и автоматически очищается, но «очистка» указателя делает не освобождениелюбая память, на которую он указывает.Это позволяет мне указывать несколько указателей на одни и те же данные.

void myAllo(int mySize, char *&myChar )
{  //note: myChar is a REFERENCE of someone else's pointer 
    myChar = new char[mySize];
}

Или еще лучше использовать вектор:

std::vector<char> myAllo(int mySize)
{
    return std::vector<char>(mySize);
}
...