﻿# V772\. Calling the 'delete' operator for a void pointer will cause undefined behavior\.

Анализатор обнаружил потенциальную ошибку в коде, связанную с тем, что оператор delete или delete\[\] применяется для нетипизированного указателя \(void\*\)\. Согласно стандарту C\+\+20 \(п\. п\. $7\.6\.2\.8/3\) такое применение ведет к неопределенному поведению\.

Рассмотрим пример:

```cpp
class Example
{
  int *buf;

public:
  Example(size_t n = 1024) { buf = new int[n]; }
  ~Example() { delete[] buf; }
};

....
void *ptr = new Example();
....
delete ptr;
....
```

Подобный код опасен тем, что компилятор в реальности не знает, к каком типу относится указатель `ptr`\. Поэтому, при удалении такого нетипизированного указателя могут произойти различные неприятности, например, может возникнуть утечка памяти: оператор `delete` не вызовет деструктор объекта типа `Example`, на который ссылается указатель `ptr`\.

Если подразумевалась именно работа с нетипизированным указателем, то перед применением оператора `delete` \(`delete[]`\) его необходимо привести к изначальному типу, например так:

```cpp
....
void *ptr = new Example();
....
delete (Example*)ptr;
....
```

Иначе, во избежание ошибок, рекомендуется использовать только типизированные указатели совместно с оператором `delete` \(`delete[]`\):

```cpp
....
Example *ptr = new Example();
....
delete ptr;
....
```