AUTOSAR C++14 Rule A18-5-11

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

Описание

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

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

Объяснение

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

Дефект может также указать на ошибку кодирования. Например, вы перегрузили форму размещения operator new[]:

void *operator new[](std::size_t count, void *ptr);
но форма неразмещения operator delete[]:
void operator delete[](void *ptr);
вместо формы размещения:
void operator delete[](void *ptr, void *p );

При перегрузке operator new, убедитесь, что вы перегружаете соответствующий operator delete в том же осциллографе, и наоборот. Найти operator delete соответствие operator new, смотрите страницы с описанием для operator new и operator delete.

Реализация Polyspace

Средство проверки правила повышает нарушение, когда вы перегружаете operator new но не перегружайте соответствующий operator delete, или наоборот.

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

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

Примеры

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

#include <new>
#include <cstdlib>

int global_store;

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


void *operator new(std::size_t size, const std::nothrow_t& tag);
void *operator new(std::size_t size, const std::nothrow_t& tag) //Noncompliant
{
    void *ptr = (void*)malloc(size);
    if (ptr != nullptr)
        update_bookkeeping(ptr, true);
    return ptr;
}

void operator delete[](void *ptr, const std::nothrow_t& tag);
void operator delete[](void* ptr, const std::nothrow_t& tag) //Noncompliant
{
    update_bookkeeping(ptr, false);
    free(ptr); 
}

В этом примере, перегрузках операторов operator new и operator delete[] несовместимы, потому что нет никаких перегрузок соответствующего operator delete и operator new[] операторы.

Перегрузка operator new вызывает функциональный update_bookkeeping изменить значение глобальной переменной global_store. Если operator delete по умолчанию называется, эта глобальная переменная незатронута, который может игнорировать ожидания разработчика.

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

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