Какой тип интеллектуального указателя мне нужен, если я хочу освободить память при перенаправлении указателя? - PullRequest
2 голосов
/ 23 марта 2012

У меня есть переменная экземпляра для класса, которая будет содержать текущий объект, над которым работает этот объект класса.

class something {
    base* _currentOperation;
}

Операция сигнализирует о завершении, сигнал, который я просто передаю классу, который является владельцем текущего объекта класса. Затем я создаю новую операцию и назначаю ей указатель _currentOperation. Есть ли какой-либо тип указателя, который освобождает память, когда вы перенаправляете указатель, или я должен просто вызвать "deleteLater ()" перед назначением его новому объекту?

И если я использовал здесь, например, QPointer, из-за долгосрочного хранения и из-за того, что я не хочу указателей облысения, как я могу сохранить в нем производный тип?

Кроме того, кто-нибудь может дать мне пример QSharedPointer, где вы можете хранить производные классы? И как мне передать его другим функциям и когда он будет выпущен? Пытался найти документ, но он никогда не показывал код, как вы можете его использовать.

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Я думаю, что вы ищете QScopedPointer .Также мой ответ на этот вопрос может помочь вам.

1 голос
/ 23 марта 2012

Если у вас не будет нескольких владельцев указателя, который вы хотите использовать QScopedPointer. QScopedPointer берет на себя ответственность за указатель и уничтожит его при уничтожении экземпляра QScopedPointer. Проверьте документацию для подробной информации.

Создание нового указателя



    QScopedPointer<base> _currentOperation;

Если вы не предоставите указатель на конструктор, по умолчанию он будет 0. _currentOperation может взять на себя ответственность за любой объект типа base или любой производный тип base, как обычный указатель (не забудьте использовать виртуальные деструкторы).

Если вы хотите установить _currentOperation на новый указатель, используйте



    _currentOperation.reset( the_new_pointer );

Операция reset сначала уничтожит объект, которым QScopedPointer владеет в настоящее время, а затем станет владельцем the_new_pointer.

Есть несколько способов обойти указатель. Вы можете либо передать QScopedPointer по ссылке, либо, если вы знаете (хотя не рекомендуется, если это необходимо), объект не будет удален, пока вызывающая функция его использует, вы можете передать указатель, вызвав _currentOperation.data()

1 голос
/ 23 марта 2012

Сбрасываемые умные указатели обычно освобождают ресурс (память) при их сбросе (указывает на что-то еще).Иначе они не были бы очень умными!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...