Есть ли утечка памяти в коде

181
16 августа 2017, 19:12

Есть участок кода в программе:

while (true) {
  char value[len+1];
  //какие-то операции с переменной value
}

Есть ли тут утечка памяти, если не обнулять переменную value в конце операций цикла?

Answer 1

Нет.
Ваш массив value относится к классу автоматической памяти. Он будет уничтожен без вашего участия.

Теперь о том, когда утечки могут возникать. Утечки памяти могут появиться когда вы начинаете выделять память вручную:

char *value = new char[len+1];

В моем примере объявлена переменная value типа "указатель на char". Эта переменная указывает на участок памяти, за освобождение которого отвечаете вы.

Чтобы утечки не было, нужно удалить то, на что указывает value:

delete[] value;

Таким образом код примет такой вид:

void foo(int len){
    char *value = new char[len+1];
    //...
    delete[] value;
}

PS: Кстати, ваш код примерно так и должен выглядеть. Потому что в С++ размер массива должен быть известен на этапе компиляции. Если ваш компилятор прожевал char value[len+1], то это не значит что другой сделает то же самое.

Answer 2

Здесь не происходит динамическое выделение памяти, поэтому ни о какой утечке не может быть и речи. Хотя char value[len+1] будет работать только на gcc.

Answer 3

Помню как то препода спрашивал "стоит ли выносить объявления переменных перед циклом" препод сказал что не нужно, не помню аргументировал ли.

Во всех кодах которые пишут умны люди (большие корпорации) тоже видно что переменные объявляться в теле цикла.

Моя логика говорит: зачем каждый раз выделять область памяти, это же тоже занимает какое то время для машины, но делаю как все))

Возможно "умные" компиляторы, все новые переменные в цикле как то сами оптимизируют код, не знаю.

READ ALSO
Почему в С функции пишут под main()? [требует правки]

Почему в С функции пишут под main()? [требует правки]

В С функции пишут под main() и потом приходится выносить прототипы функцийХотя в Паскале, да и в С можно, писать над main() и прототипы не понадобятся

170
Сборка .deb пакета из qt приложения

Сборка .deb пакета из qt приложения

Нужно собратьdeb пакет

391
WDK отладка драйверов

WDK отладка драйверов

ЗдравствуйтеНе могу нормально настроить Kernel Debugger Visual Studio 2015

168