Missing overload of allocation or deallocation function

Только одна функция в паре функции освобождения выделения перегружается

Описание

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

Примеры

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

#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); 
}

Информация о результате

Группа: Хорошая практика
Язык: C++
Значение по умолчанию: 'off'
Синтаксис командной строки: MISSING_OVERLOAD_NEW_DELETE_PAIR
Удар: низко

Введенный в R2019a