Альтернатива FxCop должна была бы использовать инструмент NDepend, который позволяет записи Правила Кода по Запросам C# LINQ (а именно, CQLinq) . Правовая оговорка: Я - один из разработчиков инструмента
[больше чем 111], 200 правил кода предложены по умолчанию. Настройка существующих правил или создание Ваших собственных правил просты благодаря известный синтаксис C# LINQ.
NDepend накладывается с FxCop на некоторых правилах кода, но предлагает много правил уникального кода. Вот несколько правил, что я классифицировал бы, поскольку должен - следовать :
Уведомление, которое Правила могут быть проверены живой в Visual Studio и во время Процесса сборки, в генерировал отчет .
HTML+javascript
Приведет ли это к утечке памяти, очистит ли ваш жесткий диск, приведет ли вас к беременности, заставит мерзких назальных демонов преследовать вас по вашей квартире или позволит всем работать нормально без видимых проблем, не определено. Это может быть так с одним компилятором и изменение с другим, изменение с новой версией компилятора, с каждой новой компиляцией, с фазами луны, вашим настроением или в зависимости от количества нейтрино, прошедших через процессор в последний солнечный день. после полудня. А может и нет.
Все это и бесконечное количество других возможностей объединяются в один термин: Неопределенное поведение :
Просто держитесь подальше от этого.
Использование оператора удаления в распределение с новым T [n] равно undefined и будет варьироваться от компилятора к компилятору. AFAIK, компилятор MSVC, например, создаст код, отличный от GCC.
Если A указывает на массив, который был выделен с помощью new T [n], то вы должны удалить его с помощью delete [] A. Разница между delete и delete [ ] прост - первый уничтожает скалярный объект, а второй уничтожает массив.
Обычно утечки не происходит, потому что в случае POD деструкторы тривиальны и их не нужно вызывать, поэтому delete
просто освобождает память, занятую массивом. Для освобождения памяти требуется только значение указателя, поэтому оно будет возвращено в кучу. Массив соответствует непрерывному блоку памяти, и поэтому освобождение может быть успешным, как если бы оно было освобождением одного элемента.
Но не полагайтесь на это, поскольку это неопределенное поведение. Может быть, все работает нормально, может случится что-то ужасное, работает с этим компилятором, не работает с другим, и многие люди благодарят вас за то, что вы внесли ошибку.
Подробнее см. этот ответ .
Для массива 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)