Удаление объекта QObject, на который указывает QSharedPointer - PullRequest
0 голосов
/ 21 октября 2018

В моем проекте я создаю QObject экземпляров и даю им отношения родитель-потомок.Я также хочу отслеживать некоторые объекты с QSharedPointer экземплярами.

Когда объект удаляется, либо delete childObject;, либо delete parentObject;, я бы хотел, чтобы экземпляры QSharedPointer возвращали true при вызове isNull().

Однако при удалении любого объекта, на который указывает QSharedPointer, моя программа падает.

Вот мой код:

QObject *child = new QObject();
QSharedPointer<QObject> ptr(child);
delete child;

Это само по себе вылетает из моей программы.Я прочитал документацию для QSharedPointer и там указано A QSharedPointer object can be created from a normal pointer, поэтому я немного запутался, почему QSharedPointer не может обработать объект, указывающий на удаление.

QPointer не делаетУ меня есть эта проблема, и я даже могу вызвать isNull(), однако причина, по которой мне нужно QSharedPointer, заключается в том, что некоторые дочерние объекты будут созданы и не будут иметь родительского элемента, и в этот момент я хочу, чтобы дочерний объект был удален, когда все соответствующие QSharedPointers выйти за рамки.

1 Ответ

0 голосов
/ 21 октября 2018

QSharedPointer становится владельцем необработанного указателя, который вы передаете ему.Это означает, что как только все общие указатели выйдут из области видимости, он удалит объект, на который указываетЕсли вы уже удалили объект вручную, это приведет к двойному освобождению, что приведет к сбою (если вам повезет!).

При использовании общего указателя вам вообще не нужно вручную вызывать deleteпроизойдет автоматически, как указано выше.

...