AUTOSAR C++14 Rule A18-5-4

Если проект измерил, или неразмерная версия оператора 'удаляют' глобально заданный, то и измеренные и неразмерные версии должны быть заданы

Описание

Управляйте определением

Если проект измерил, или неразмерная версия оператора 'удаляют' глобально заданный, то и измеренные и неразмерные версии должны быть заданы.

Объяснение

C++ 14 Стандартов задает размерную версию operator delete. Например, для неразмерного operator delete с этой подписью:

void operator delete (void* ptr);
Размерная версия имеет дополнительный аргумент размера:
void operator delete (void* ptr, std::size_t size);
Смотрите страницу с описанием C++ для operator delete.

Стандарт утверждает что если обе версии operator delete существуйте, размерная версия должна быть названа, потому что она обеспечивает более эффективный способ освободить память. Однако в некоторых случаях, например, чтобы удалить неполные типы, неразмерная версия используется.

Если вы перегружаете неразмерную версию operator delete, необходимо также перегрузить размерную версию. Вы обычно перегрузка operator delete выполнять некоторую бухгалтерию в дополнение к освобождению памяти на свободном хранилище. Если вы перегрузите неразмерную версию, но не размерную или наоборот, то любая бухгалтерия, которую вы выполняете в одной версии, будет не использована от другой версии. Этот пропуск может привести к неожиданным результатам.

Реализация Polyspace

Средство проверки отмечает ситуации где неразмерная версия operator delete существует, но соответствующая размерная версия не задана, или наоборот.

Средство проверки включено, только если вы задаете версию C++ C++ 14 или позже. Смотрите C++ standard version (-cpp-version).

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include <new>
#include <cstdlib>

int global_store;

void update_bookkeeping(void *allocated_ptr, bool alloc) {
   if(alloc) 
      global_store++;
   else
      global_store--;
}

void operator delete(void *ptr);
void operator delete(void* ptr) {
    update_bookkeeping(ptr, false);
    free(ptr); 
}

void operator delete(void *ptr, std::size_t size);
void operator delete(void* ptr, std::size_t size) { 
    //Compliant, both sized and unsized version defined
    update_bookkeeping(ptr, false);
    free(ptr); 
}

void operator delete[](void *ptr);
void operator delete[](void* ptr) { //Noncompliant, only unsized version defined
    update_bookkeeping(ptr, false);
    free(ptr); 
}

В этом примере, оба неразмерная и размерная версия operator delete перегружаются и выполняет правило. Однако только неразмерная версия operator delete[] перегружается, который нарушает правило..

Проверяйте информацию

Группа: вспомогательная библиотека языка
Категория: необходимый, автоматизированный
Введенный в R2019a