# V1006. Several shared_ptr objects are initialized by the same pointer. A double memory deallocation will occur.

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

Рассмотрим пример некорректного кода.

    void func()
    {
      S *rawPtr = new S(10, 20);
      std::shared_ptr<S> shared1(rawPtr);
      std::shared_ptr<S> shared2(rawPtr);
      ....
    }

При выходе из функции, объект 'shared1' освободит указатель 'rawPtr', после чего объект 'shared2' также попытается освободить его еще раз, что приведет к некорректной работе программы.

Корректный код:

    void func()
    {
      std::shared_ptr<S> shared1(new S(10, 20));
      std::shared_ptr<S> shared2(new S(10, 20));
      ....
    }

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

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

CWE-675 CERT-MEM56-CPP