Delete of void pointer

delete действует на void* указатель, указывающий на объект

Описание

Этот дефект возникает, когда delete оператор работает на void* указатель.

Риск

Удаление void* указатель не определен в соответствии со стандартом C++.

Если объект имеет тип MyClass и delete оператор работает на void* указатель, указывающий на объект, MyClass деструктор не вызывается.

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

Зафиксировать

Приведите void* указатель на соответствующий тип. Выполните delete операция по результату приведения.

Для образца, если void* указатель указывает на MyClass объект, приведите указатель на MyClass*.

Примеры

расширить все

#include <iostream>

class MyClass {
public:
    explicit MyClass(int i):m_i(i) {}
    ~MyClass() {
        std::cout << "Delete MyClass(" << m_i << ")" << std::endl;
    }
private:
    int m_i;
};

void my_delete(void* ptr) {
    delete ptr;
}


int main() {
    MyClass* pt = new MyClass(0);
    my_delete(pt);
    return 0;
}

В этом примере функция my_delete предназначен для выполнения delete операция для любого типа. Однако в теле функции delete операция действует на void* указатель, ptr. Поэтому, когда вы звоните my_delete с аргументом типа MyClass, а MyClass деструктор не вызывается.

Коррекция - Приведение void* Указатель на MyClass*

Одним из возможных решений является использование шаблона функции вместо функции для my_delete.

#include <iostream>

class MyClass {
public:
    explicit MyClass(int i):m_i(i) {}
    ~MyClass() {
        std::cout << "Delete MyClass(" << m_i << ")" << std::endl;
    }
private:
    int m_i;
};


template<typename T> void safe_delete(T*& ptr) {
    delete ptr;
    ptr = NULL;
}


int main() {
    MyClass* pt = new MyClass(0);
    safe_delete(pt);
    return 0;
}

Информация о результатах

Группа: Хорошая практика
Язык: C++
По умолчанию: Off
Синтаксис командной строки: DELETE_OF_VOID_PTR
Влияние: Низкое
Введенный в R2015b