Удалите пустого указателя

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