Это диагностическое правило основано на пункте 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 }
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1062. |