# V1062. Class defines a custom new or delete operator. The opposite operator must also be defined.

Это диагностическое правило основано на пункте R.15 CppCoreGuidelines.

В классе определен оператор 'new' или 'delete', но при этом не определен обратный оператор.

Пример:

    class SomeClass
    {
      ....
      void* operator new(size_t s);
      ....
    };

Для динамической аллокации объекта такого класса будет использоваться перегруженный оператор 'new', а для удаления – оператор 'delete', определенный по умолчанию.

Для симметрии операций аллокации/деаллокации следует определить также оператор 'delete':

    class SomeClass
    {
      ....
      void* operator new(size_t s);
      void operator delete(void*);
      ....
    };

Также операторы можно пометить как удаленные ('= delete'), если по какой-то причине необходимо запретить аллокацию или деаллокацию для объектов класса. При этом желательно одновременно запретить и аллокацию и деаллокацию, чтобы вызов любого из этих операторов приводил к ошибке времени компиляции, а не к трудно уловимому багу:

    #include <cstddef>
    class AutoTransaction
    {
    public:
        /// Mark 'operator new' as deleted to prevent heap allocation
        void* operator new (std::size_t) = delete;
    };

    void foo()
    {
      auto ptr = new AutoTransaction; // code doesn't compile
    }

    void bar()
    {
      AutoTransaction obj;
      delete &obj;         // code compiles, but contains an error
    }

Если также запретить деаллокацию, то компилятор не позволит совершить ошибку:

    class SomeClass
    {
      ....
      void* operator new(size_t s) = delete;
      void operator delete(void*) = delete;
      ....
    };

    void foo()
    {
      auto ptr = new AutoTransaction; // code doesn't compile
    }

    void bar()
    {
      AutoTransaction obj;
      delete &obj;         // code doesn't compile
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки управления динамической памятью (выделения, освобождения, использования освобожденной памяти) [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-762

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1062.