exponenta event banner

Правило AUTOSAR C++ 14 A18-5-11

«оператор new» и «оператор delete» определяются вместе

Описание

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

«оператор new» и «оператор delete» определяются вместе.

Объяснение

Как правило, происходит перегрузка 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