AUTOSAR C++14 Rule A18-5-4

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

Описание

Определение правила

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

Объяснение

Стандарт 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