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 существуйте, размерная версия должна быть названа, потому что она обеспечивает более эффективный способ освободить память, особенно когда средство выделения выделяет в категориях размера вместо того, чтобы хранить размер nearbly объект. Однако в некоторых случаях, например, чтобы удалить неполные типы, неразмерная версия используется.

Если вы перегружаете неразмерную версию 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