Как предотвратить удаление указателей, управляемых qsharedPointer

StackOverflow https://stackoverflow.com/questions/4155088

Вопрос

У меня есть некоторые прерывистые неисправности сегментации в приложении QT. Я думаю, что проблема связана с нашим (плохой) использованием QSharedPointer. Отказ То Состояния документации QT :

Qsharedpointer :: qsharedpointer (t * ptr): создает qsharedpointer, который указывает на PTR. Указатель PTR становится управляемым этим qsharedpointer и не должно быть передано другому объекту QSharedPoine или удален за пределами этого объекта.

Я думаю, что мы делаем обоих не должен... :/

Есть ли ооос, способ для обеспечения того, чтобы указать указатель QSharedPointer не может быть удален или передан другому QSharedPointer?

Лучшее решение будет иметь ошибку компилятора.

Это было полезно?

Решение

Нормальный шаблон - поставить new Заявление внутри конструктора умных указателей, как это:

QSharedPointer<Obj> p (new Obj(2)); 

Таким образом, у вас никогда не будет ссылки на саму нагородный указатель.

Если вы ревертеруете свой код, чтобы весь новый оператор находился в следующих линиях, все ваши проблемы будут решены.

Другие советы

Что ж, путь OOP-ESQUE будет создавать необработанный указатель в качестве частного члена в классе обертки и выполнять действия только на указателе через методы, которые действуют на общий указатель. Вроде глупых, хотя, не так ли?

Или вы могли бы сделать ваш класс с помощью RAW POINTER базовым классом на другие классы и сделать сырой указатель частным членом в классе. В связи с этим вы более или менее создавая абстрактный класс, который ничего не делает. Ваши производные классы должны делать всю работу, и поскольку они не могут получить доступ к сырому указателю, компиляция потерпит неудачу ... это не останавливает кого-то от того, что кто-то не просто копировать значение сырого указателя из общего указателя.

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

Редактировать: Я мог бы добавить, что независимо от того, используете ли вы общие указатели, звучит так, как будто вы имеете вопросы собственности. Если указатель был создан в одном объеме, он должен быть удален в этом объеме, если только функция не передается договор берет владение указателем. Использование общего указателя в этом сценарии будет вызвать только разные ошибки, в конце концов. Похоже, у вас есть проблемы с дизайном глубже, чем просто обмен указателями.

Я не знаком с особой реализацией QT обмениваемого указателя, но в качестве общего руководства: попытка смешивать сырые указатели с управляемыми указателями обычно заканчиваются кровью. После того, как вы «доверяете» общую реализацию указателя в принятии владения своими динамически выделенными данными, вы не должны ни при каких обстоятельствах не постарайтесь управлять жизнью объекта самостоятельно (например, удалением предоставленного указателя).

Есть ли способ принуждать, что указатель, управляемый QSharedPointer, не может быть удален?

Я предполагаю, что вы можете себе представить, что какая-то странная техника, в которой указанный тип будет иметь частный деструктор и объявить qsharedPointer в качестве друга (который бы эффективно предотвратить любую «внешнее удаление» от компиляции), но я бы не поспорил, что ничего хорошего может выйти из этого (и обратите внимание, что он сделает ваш тип абсолютно непригодным для использования, если не будет новым и не передан в qsharedPointer).

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

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

Проверьте свой код для всех .data () Использование и убедитесь, что они возвращаются, не хранятся ни удалена. Я не думаю, что ошибка жесткой компиляторы была бы хорошей, потому что иногда это нормально передавать сырой указатель, например, в функцию, которая не хранит ни удаления прохожденных указателей. (Особенно при использовании 3-й партийного кода вы не всегда можете изменить все, чтобы использовать общие указатели, и часто вы хотите, чтобы он работал как с обоими, сырыми, так и общими PTR). Можно отметить QSharedPointer :: data () как устаревшие (по исправлению Qt), чтобы получить предупреждение о компиляции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top