Удаление общего указателя - PullRequest
1 голос
/ 30 октября 2009

У меня есть указатель на QScriptEngine, который я передаю через перегруженный конструктор класса Evaluator и присваиваю его QScriptEngine *engine_ (класс Property подклассы Evaluator, и вызывает этот конструктор Evaluator, передав ему уже выделенное QScriptEngine). Конструктор без аргументов создает новый указатель QScriptEngine (таким образом, класс Generic подклассов Evaluator). В деструкторе, который я проверяю, если engine_ не равен NULL, удалите указатель, затем присвойте ему NULL. Должен ли указатель (engine_) в производном Property теперь также быть NULL? Что-то говорит мне, что это не тот случай. Если нет, как вы справляетесь с этой ситуацией? Мне нужно, чтобы QScriptEngine был одним и тем же экземпляром повсюду. QScriptEngine Оператор s = является приватным, иначе я бы избегал указателя все вместе.

Я видел некоторую информацию об общих указателях (boost::shared_ptr и std:tr1::shared_ptr) в другом вопросе SO. Я уже использую boost для библиотеки regex, так что boost не исключен, если это лучший способ справиться с этим. Будем надеяться, что для общего знания C ++ и будущих проектов существует не требующий ускорения способ.

1 Ответ

4 голосов
/ 30 октября 2009

Вы можете решить эту проблему, предоставив одному из классов (класса A) контроль времени жизни этого указателя вместе с методом getter. Другой класс (класс B) будет всегда вызывать метод получения A всякий раз, когда ему нужен указатель. Таким образом, A всегда будет контролировать указатель. Недостатком является функция получения (она, вероятно, будет встроенной, но это все еще вторая косвенная информация). Кроме того, B придется проверять этот указатель на NULL практически при каждом использовании.

Ваш другой выбор - заключить указатель в нечто вроде boost :: shared_ptr, который решает проблему (при правильном использовании), удерживая базовый указатель, и удаляя его только тогда, когда все объекты, разделяющие этот указатель, удалены. Вы могли бы написать это самостоятельно, но, поскольку у вас уже есть прирост в игре, я бы просто использовал их реализацию.

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

...