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

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

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

Пример:

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

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

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

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

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



```cpp
#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
}
```

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

```cpp
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
}
```