Удаляют [] равный для удаления?

Альтернатива FxCop должна была бы использовать инструмент NDepend, который позволяет записи Правила Кода по Запросам C# LINQ (а именно, CQLinq) . Правовая оговорка: Я - один из разработчиков инструмента

[больше чем 111], 200 правил кода предложены по умолчанию. Настройка существующих правил или создание Ваших собственных правил просты благодаря известный синтаксис C# LINQ.

NDepend накладывается с FxCop на некоторых правилах кода, но предлагает много правил уникального кода. Вот несколько правил, что я классифицировал бы, поскольку должен - следовать :

Уведомление, которое Правила могут быть проверены живой в Visual Studio и во время Процесса сборки, в генерировал отчет .

HTML+javascript

44
задан Jabberwocky 10 November 2016 в 12:40
поделиться

4 ответа

Приведет ли это к утечке памяти, очистит ли ваш жесткий диск, приведет ли вас к беременности, заставит мерзких назальных демонов преследовать вас по вашей квартире или позволит всем работать нормально без видимых проблем, не определено. Это может быть так с одним компилятором и изменение с другим, изменение с новой версией компилятора, с каждой новой компиляцией, с фазами луны, вашим настроением или в зависимости от количества нейтрино, прошедших через процессор в последний солнечный день. после полудня. А может и нет.

Все это и бесконечное количество других возможностей объединяются в один термин: Неопределенное поведение :

Просто держитесь подальше от этого.

149
ответ дан 26 November 2019 в 21:37
поделиться

Использование оператора удаления в распределение с новым T [n] равно undefined и будет варьироваться от компилятора к компилятору. AFAIK, компилятор MSVC, например, создаст код, отличный от GCC.

Если A указывает на массив, который был выделен с помощью new T [n], то вы должны удалить его с помощью delete [] A. Разница между delete и delete [ ] прост - первый уничтожает скалярный объект, а второй уничтожает массив.

4
ответ дан 26 November 2019 в 21:37
поделиться

Обычно утечки не происходит, потому что в случае POD деструкторы тривиальны и их не нужно вызывать, поэтому delete просто освобождает память, занятую массивом. Для освобождения памяти требуется только значение указателя, поэтому оно будет возвращено в кучу. Массив соответствует непрерывному блоку памяти, и поэтому освобождение может быть успешным, как если бы оно было освобождением одного элемента.

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

Подробнее см. этот ответ .

7
ответ дан 26 November 2019 в 21:37
поделиться

Для массива POD он не будет утечки (с большинством компиляторов). Например, MSVC генерирует идентичный код для delete и delete [] для массива POD .

] Лично я думаю, что C / C ++ мог бы быть без оператора delete []. Компилятор знает размер объекта и размер выделенной памяти известен во время выполнения, поэтому очень просто узнать, является ли массив указателей или нет, и правильно распределить память.

EDIT:

Хорошо, ребята. Можете ли вы протестировать свой компилятор и сказать, нет ли утечек?

Попробуйте думать как разработчик компилятора. У нас есть новый , новый [] , удалить , удалить [] . Каждый новый имеет собственное удаление . Кажется идеальным и законченным. Посмотрим, что происходит, когда вы вызываете delete [] ?

1. call vector destructor for an object
2. actual free memory

Что такое деструктор для POD ? Ничего такого! Таким образом, вызов delete для массива POD не приведет к утечке! Даже если это нарушает стандарты. Даже если это не рекомендуется.

РЕДАКТИРОВАТЬ2:

Это код дизассемблирования, созданный VS2008:

operator delete[]:
78583BC3  mov         edi,edi 
78583BC5  push        ebp  
78583BC6  mov         ebp,esp 
78583BC8  pop         ebp  
78583BC9  jmp         operator delete (78583BA3h) 
-4
ответ дан 26 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: