AUTOSAR C++14 Rule 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