Путевской Виктор (vipernn) wrote,
Путевской Виктор
vipernn

Categories:

Errare humanum est

Два с половиной рабочих дня потратил на поиск совершенно дурацкой ошибки в программе. В некоем месте программы было необходимо выделить блок памяти под массив данных. Делается это следующим кодом:

double pData = new double [size];

Здесь size - размер массива. И вот тут-то и закралась ошибка. Вместо квадратных скобок я по ошибке написал круглые, то есть:

double pData = new double (size);

При этом, с точки зрения компилятора C++, код с круглыми скобками является также вполне легальным. Но вместо распределения памяти для size элементов типа double, данный код распределит память лишь под одну переменную типа double, преобразует size в значение типа double и расположит это значение по полученному адресу.

Дальнейшее выполнение программы зависит исключительно от везения программиста. Чисто теоретически, она может даже успешно выполняться. Особенно, если size мало. Гарантированно программу завалит команда освобождения памяти. Для освобождения памяти под одну переменную используется код:

delete pData;

А для освобождения памяти, распределенной под массив, необходимо использовать код:

delete [] pData;

Естественно, если использовать второй вариант вместо первого в попытке освободить память массива, тогда как память распределена только под одну переменную, то добром это не кончится - вывалится ошибка доступа к памяти. Интересно, что если ошибиться наоборот, то есть вызвать команду освобождения памяти, распределенной для одной переменной вместо освобождения памяти, распределенной для массива, то ошибки не будет. Будет освобождена память, которую занимает первый элемент, а остальная память останется занятой. То есть ошибки не будет, но будет утечка памяти. Если зарезервированная память имеет достаточно большой объем, а операцию распределения/освобождения памяти с неправильной командой проделать несколько раз, то можно нарваться на ошибку нехватки памяти.

Так что будьте внимательнее к мелочам.
Tags: пакости, программирование, рабочее
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments