CERT C++: DCL54-CPP

Выделение перегрузки и освобождение функционируют как пару в том же осциллографе

Описание

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

Выделение перегрузки и освобождение функционируют как пару в том же scope.[1]

Реализация Polyspace

Это средство проверки проверяет на Недостающую перегрузку функции выделения или освобождения.

Примеры

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

Проблема

Недостающая перегрузка функции выделения или освобождения происходит, когда вы перегружаете operator new но не перегружайте соответствующий operator 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 new:

class MyClass {
   void* operator new  ( std::size_t count, void* ptr ){
   ...
   }
};
Убедитесь, что вы также перегружаете форму размещения operator delete:
class MyClass {
   void operator delete  ( void* ptr, void* place ){
   ...
   }
};

Найти operator delete соответствие operator new, смотрите страницы с описанием для operator new и operator delete.

Пример – не сочетается между перегруженным 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) {
    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) {
    update_bookkeeping(ptr, false);
    free(ptr); 
}

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

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

Коррекция – перегружает правильную форму operator delete

Если вы хотите перегрузить 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) {
    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) {
    update_bookkeeping(ptr, false);
    free(ptr); 
}

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

Группа: 01. Объявления и инициализация (DCL)
Введенный в R2019a

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.