블렌더와 같은 기능을 갖춘 Qt 기반 앱을 작성하고 있습니다.
shared_from_this이 예외를 throw합니다
GUI + 플러그인 시스템 및 플러그인 인 '프레임 워크'로 구성됩니다. 플러그인은 기본적으로 생성되고 표시 될 수있는 객체 (예 : 구, 상자 등)가있는 Qt dll입니다. 그 모든 객체는, 한 번 생성) (
는 내가 원하는 것은 shared_from_this을 사용하는 것입니다 (그래서 실제로 컨테이너는 거의 vector<shared_ptr<INode>>
같다) 그들에게 shared_ptr의의의를 보유하고 컨테이너 구조의 어떤 종류의 프레임 워크에 저장됩니다 플러그인 중 하나의 내부 기능. 예. 다음은 샘플 플러그인 (명확성을 위해 변경 코드)입니다 :
class INode: public QObject, public boost::enable_shared_from_this<INode>
, 컨테이너에 저장된 모든 기본 클래스 : INode
가
class Q_DECL_IMPORT SphereNode: public INode, public Sphere
. 그래서 문제는이 함수는 다음과 같습니다.
void SphereNode::update()
{
foo(shared_from_this());
}
은 boost::bad_weak_ptr
예외를 throw합니다.
이 SphereNode가 생성되는 방법을 노트의 커플 (팩토리 클래스)
boost::shared_ptr<INode> NodeFactory::createNode(const QString& type, QString tag)
{
...
QPluginLoader loader(filesPlugin_[i]);
boost::shared_ptr<QObject> plugin(loader.instance());
boost::shared_ptr<INode> iNodePlugin = boost::shared_dynamic_cast<INode>(plugin);
return iNodePlugin;
}
어떤 아이디어가?
참고 : QObject에서 공유 포인터를 사용하지 않습니다. 클래스의 사용자가 부모를 설정하면 공유 포인터와 부모가 삭제 될 때 객체가 삭제되므로 이중 삭제 문제가 발생합니다. 그들 자신. –
@ 프랭크 : 당신은 확실합니까? 나는'QObject'가 삭제 될 때 그들의 부모로부터 참조를 해방시킬만큼 충분히 똑똑하다고 생각했다. – ereOn
ereOn : 예, 공유 포인터가 먼저 오면 부모가 알아 차릴 것입니다. 그러나 부모가 자식을 먼저 삭제하면 공유 포인터는 객체 -> 이중 삭제를 삭제합니다. –