Указатель на уничтожение уничтоженного класса - PullRequest
0 голосов
/ 19 января 2019

У меня есть объект, на который указывают многие указатели.Они часто пытаются получить доступ к данным.Однако в какой-то момент этот объект может быть уничтожен.Как эффективно обновить эти указатели, как только я уничтожу объект, чтобы они не указывали на нераспределенную память и вызывали неопределенное поведение?

Моя идея составляла список указателей, которые необходимо обновитьдо nullptr.Это будет вызвано в деструкторе объекта.Ужасный беспорядок и много работы для каждой вещи, которая может быть освобождена.

Возможно, в этих умных указателях есть какое-то применение для подобных случаев (никогда не использовал их).Как программисты на C ++ справляются с такими вещами?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Гадкий беспорядок и много работы для каждой отдельной вещи, которая может быть освобождена

Ну, не делайте очистку в деструкторе.Создайте отдельную функцию и вызовите ее в деструкторе. Вы можете вызвать эту общую функцию очистки из деструкторов других объектов.

0 голосов
/ 19 января 2019

Вам просто нужно использовать std :: shared_ptr и std :: weak_ptr .

shared_ptr настолько умны, что вам не нужно их удалять, они будут удалены, когда никто больше на них не ссылается. Тогда любой weak_ptr, связанный с этим shared_ptr, будет в некотором роде проинформирован, и у него нет риска получить доступ к нераспределенной памяти.

Когда это необходимо, weak_ptr попытается lock() и создаст локальный shared_ptr. Если исходный shared_ptr был удален, lock() не сможет создать локальный shared_ptr, и вы будете уверены, что исходный указатель был удален.

// Example program
#include <iostream>
#include <assert.h>
#include <memory>

int main()
{
    std::shared_ptr<int> pI( new int(3) );
    std::weak_ptr<int> wI( pI );

    {
        // check if weak_ptr still "points" to some valid data:
        std::shared_ptr<int> pICopy = wI.lock();
        assert( pICopy != NULL );
        std::cout << "pI still valid " << *pICopy << std::endl;
    }

    pI.reset(); // this is equivalent to regular delete with shared_ptr

    {
        // check if weak_ptr does not "point" to any valid data:
        std::shared_ptr<int> pICopy = wI.lock();
        assert( pICopy == NULL );
        std::cout << "pI not valid anyore" << std::endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...