C ++ - когда уничтожается член класса без указателей? - PullRequest
3 голосов
/ 06 октября 2009

Предположим, у меня есть этот код ...

class GraphFactory : public QObject
{
private:
    QMap<QString, IGraphCreator*> factory_;

public:
    virtual ~GraphFactory();
};

GraphFactory::~GraphFactory()
{
    // Free up the graph creators
    QMap<QString, IGraphCreator*>::iterator itr;
    for (itr = factory_.begin(); itr != factory_.end(); itr++)
    {
        IGraphCreator * creator = itr.value();
        delete creator;
        creator = NULL;
    }

}

Когда уничтожается фабрика QMap? До вызова деструктора или во время деструктора? (Я понимаю, что деструктор будет вызываться, когда экземпляр GraphFactory выходит из области видимости. Но когда уничтожается элемент, не являющийся указателем?)

Редактировать: Я получаю недопустимые значения для карты factory_, когда она достигает деструктора. Точка останова показывает, что значение не изменилось бы со значением, хранящимся в QMap.

Ответы [ 3 ]

11 голосов
/ 06 октября 2009

Будет уничтожено после Выполнен код деструктора

Идея состоит в том, чтобы иметь доступ к вашим членам в коде деструктора, чтобы они уничтожались после его выполнения.

2 голосов
/ 06 октября 2009

После GraphFactory::~GraphFactory, но до QObject::~QObject. Так что на самом деле между деструкторами.

1 голос
/ 06 октября 2009

Если данные, хранящиеся в GraphFactory :: factory_ member, недействительны при вызове вашего деструктора, существует несколько способов, например, например. Двойное освобождение вашего экземпляра GraphFactory или, возможно, что-то перезаписывает его по ошибке.

Если вы работаете в Windows, то такие инструменты, как Application Verifier , могут быть очень полезны при отладке этого типа проблемы (используйте ее, чтобы включить функцию Page Heap и подключить отладчик при воспроизведении проблемы).

Если вы используете класс GraphFactory в многопоточной среде, вам следует синхронизировать доступ к экземпляру QMap, потому что в противном случае могут произойти «плохие вещи».

Мне не известны эквивалентные инструменты для других платформ. Я хотел бы услышать о них, если кто-нибудь, читающий это, узнает.

...