zHz00 Untitled

четверг, 19 ноября 2015
20:58 Тема раскрыта
Было в тексте:

double *data=new double[n];
...
delete []data;

По иронии судьбы:
1. n не проверялась;
2. n оказалась равна нулю;
3. В некоторых местах было принудительное обращение к data[0].

Что тут удивительно, так это то, что выделение памяти проходило успешно, а вот при освобождении программа падала (Access Violation). С чем это было связано точно -- не выяснил. Предполагаю, что как раз с обращением к нулевому элементу, которое прокатывало, пока память не пытались освободить. Хотя тогда должно было бы быть сообщение о HEAP corruption, хммм.

Стал по всей программе проверять подобные случаи (а их там около десятка в разных местах).

Я: Так... я посмотрел буфера... простите, пожалуйста. Там всё в порядке.
Коллега: Какой ты некультурный!
Я: Я не понимаю, о чём ты.

@темы: Программирование, Викторика

URL

24.11.2015 в 23:37

24.11.2015 в 23:37
Я точно не помню в чём соль, но создание массива нулевой длины - не причина для генерации исключения.

Во всяких референсах... гм...


When the object being created is an array, only the first dimension can be a general expression. All subsequent dimensions must be constant integral expressions. The first dimension can be a general expression even when an existing type is used. You can create an array with zero bounds with the new operator. For example:



In this case, a pointer to a unique object is returned.

An object created with operator new() or operator new[]() exists until the operator delete() or operator delete[]() is called to deallocate the object's memory. A delete operator or a destructor will not be implicitly called for an object created with a new that has not been explicitly deallocated before the end of the program.

http://www-01.ibm.com/support/knowledgecenter/SS4QVT_8.5.1/com.ibm.xlcpp111.aix.doc/language_ref/cplr199.html?lang=ru




При обнаружении в программе оператора, подобного показанному ниже, он преобразуется в вызов функции operator new.

Если в запросе требуется нуль байтов памяти, функция operator new возвращает указатель на отдельный объект (т. е. повторные вызовы operator new возвращают разные указатели).Если возникает нехватка памяти для выполнения запроса на выделение, функция operator new возвращает значение NULL или создает исключение. (Дополнительные сведения см. в статье .)

https://msdn.microsoft.com/ru-ru/library/kftdy56f.aspx




В следующем примере выделяется и затем освобождается двумерный массив символов размером dim на 10.При выделении многомерного массива все измерения, кроме первого, должны быть константными выражениями, которые возвращают положительные значения; самое левое измерение массива может являться любым выражением, результатом которого является положительное значение.При выделении массива с использованием оператора new первое измерение может быть нулевым — оператор new возвращает уникальный указатель.


https://msdn.microsoft.com/ru-ru/library/kewsb8ba.aspx



URL