﻿# V572\. Object created using 'new' operator is immediately cast to another type\. Consider inspecting the expression\.

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

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

```cpp
T_A *p = (T_A *)(new T_B());
...
delete p;
```

Возможны три варианта, как появился такой код и что с ним делать\.

1\) T\_B не является наследником от класса T\_A\.

Скорее всего, это досадная опечатка или грубая ошибка\. Способ её исправления зависит от того, что должен делать данный код\. 

2\) T\_B наследуется от класса T\_A\. Класс T\_A не имеет виртуального деструктора\.

В этом случае приводить T\_B к T\_A нельзя, так как потом невозможно корректно уничтожить созданный объект\. Корректный код:

```cpp
T_B *p = new T_B();
...
delete p;
```

3\) T\_B наследуется от класса T\_A\. Класс T\_A имеет виртуальный деструктор\.

В этом случае код корректен, но явное приведение типа не имеет смысла\. Можно написать проще:

```cpp
T_A *p = new T_B();
...
delete p;
```

Бывают и другие ситуации, когда будет выдано предупреждение V572\. Рассмотрим пример кода, взятый из реального приложения:

```cpp
DWORD CCompRemoteDriver::Open(HDRVR,
  char *, LPVIDEO_OPEN_PARMS)
{
  return (DWORD)new CCompRemote();
}
```

Программа для своих нужд работает с указателем, как с дескриптором\. Для этого она явно приводит указатель к типу DWORD\. Такой код будет корректно работать в 32\-битных системах, но может привести к сбою в 64\-битной программе\. Можно избежать [64\-битной ошибки](https://pvs-studio.ru/ru/blog/terms/0002/), используя более подходящий тип данных DWORD\_PTR:

```cpp
DWORD_PTR CCompRemoteDriver::Open(HDRVR,
  char *, LPVIDEO_OPEN_PARMS)
{
  return (DWORD_PTR)new CCompRemote();
}
```

Иногда, причиной для предупреждения V572 является атавизм, оставшийся со времен, когда код был написан на языке Си\. Рассмотрим пример такого кода:

```cpp
struct Joint {
  ...
};
joints=(Joint*)new Joint[n]; //malloc(sizeof(Joint)*n);
```

Комментарий подсказывает нам, что раньше для выделения памяти использовалась функция 'malloc'\. Теперь для этого используется оператор 'new'\. Но удалить приведение забыли\. Код корректен, но приведение типа здесь совершенно излишне\. Можно написать более короткий код:

```cpp
joints = new Joint[n];
```