При передаче динамического массива из функции нету утечки памяти?

У меня есть функция:

int** matrix(){
    int** arr_func = new int* [3];
    //...
    return are_func

}

Основная часть программы:

int main() {


    int** infoBusy = new int* [1];

    infoBusy = matrix();
    //....
        for (int i = 0; i < 1; i++){
    delete[] infoBusy[i];
}

delete[] infoBusy;

Матрица infoBusy удаляется в основном коде, но удаляется ли матрица arr_func что в функции?


Ответы (1 шт):

Автор решения: Harry

Утечка есть, но не там, где вы ее ждете.

То, что выделено в функции, честно удаляется. Утечка при перезаписи -

int** infoBusy = new int* [1];  // Вот этот указатель не сохраняется и "утекает"
infoBusy = matrix();

Пишите просто

int** infoBusy = matrix();

Смотрите - утечка возникает, когда выделена динамическая память, но не удалена. Как в вашем исходном коде - память выделена, указатель записан в переменную, тут же перезаписан - и теперь при всем желании его невозможно получить, чтобы освободить выделенную память. Утечка!

В функции она у вас выделена, указатель на нее возвращен, и память по этому указателю удалена. Сама переменная are_func располагается в стеке и ее память освобождается при завершении функции. Еще раз - память, выделенная для переменной, а не выделенная память, указатель на которую хранится в этой переменной.

Почитайте эту модель. В ее рамках возврат из функции - вы просто передаете документы и ключи от прокатной машины другу. Если друг, попользовавшись, честно сдаст ее обратно - никаких проблем не возникнет...

→ Ссылка