вторник, 2 июля 2013 г.

Объём утечки памяти при выделении её с помощью new для нулевого количества байт

Заинтересовал такой вопрос: если используя оператор new выделить память для массива, указав в качестве его размера значение 0, после чего не вызывать оператор delete, то будет ли утечка памяти, и если будет то в каком объёме?

Согласно спецификации языка C++ следует, что если удаётся выделить запрошенный объём памяти, то оператор new возвращает указатель, отличный от nullptr, указывающий на первую ячейку выделенной памяти. В противном же случае генерируется  исключение bad_alloc.

Так же известно, что для каждого указателя, полученного с помощью new, следует в дальнейшем вызывать delete, дабы исключить утечку памяти:

int* a = new int[0];
// ...
delete[] a;

Выяснилось, что если в обозначенном мною выше случае не вызывать delete, исходя из предположения, что "ведь запрошен был нулевой объём памяти", то тем не менее утечка всё же происходит... По поводу объёма утечки мне ответил Беарне Стровструп:
Точный объем утечки памяти, зависит от реализации [компилятора], вероятно это будет два или три слова (word).

В общем случае, размер слова зависит от размера процессорного регистра: для 32-х битного регистра размер слова составляет 32 бита, а для 64-х битного - 64.

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

Комментариев нет: