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