Установка значения указателя на nullptr
не изменяет данные, на которые он указывает.Стирание элемента из вектора перезапишет этот элемент всеми последующими в векторе, оставляя (в этом случае) второй указатель в выделенной памяти (за пределами размера вектора) до последнего элемента в векторе.
Чтобы стереть память, занятую объектом, на который указывает DeleteMyClass
, вам придется обрабатывать уничтожение объекта и освобождение памяти отдельно.Это не обязательно легко или просто, поскольку могут быть нюансы (обработка исключений, массивы и не-массивы), которые необходимо учитывать.Вам также следует помнить, что можно проверить память запущенного процесса и просмотреть данные, которые вы пытаетесь удалить, в то время как объект, который его использует, является действующим.
Вот несколько подходов, которые могутработа для вас.
Один из способов сделать это - вручную вызвать деструктор, очистить память и освободить ее.
DeleteMyClass->~MyClass();
memset(DeleteMyClass, 0, sizeof(*DeleteMyClass));
delete (void *) DeleteMyClass;
Приведение к вызову удаления необходимоизбегайте вызова деструктора, а число очищаемых байтов использует тип DeleteMyClass
, который будет неверным, если на него указывает класс, производный от MyClass
.
Другой альтернативой является использование размещение нового с уже выделенным буфером памяти и специальным освобождающим устройством (после ручного вызова деструктора) для освобождения памяти.
Третья возможность - использовать custom new
*Функции 1022 * и delete
, либо для этого конкретного класса, либо для всего мира.