作者:开在覀黎明前的小茉莉 | 来源:互联网 | 2023-01-30 16:32
我们的应用程序的设计非常差-它既使用std::shared_ptr
和QObject
亲子关系来管理我们的一些对象。当QObject::~QObject
删除其子对象,然后shared_ptr
尝试也将其删除时,这会导致段错误。
我们讨论了此问题,但目前尚无轻松解决此问题的方法,因此在我们对其进行修复之前,我将需要使用一些肮脏的技巧。
现在我有一个std::shared_ptr getMyObjectPtr()
功能。我需要将结果放入QPointer
-QPointers是弱指针,仅指示他们管理的QObject是否已删除。我无法以任何方式更改该功能,它将破坏整个应用程序。
我使用自定义脱发器尝试了一些技巧,但这似乎行不通。
// get the shared_ptr from inacessible API
std::shared_ptr oldPtr(getMyObjectPtr());
// create a new pointer that never deletes it's value
std::shared_ptr newPtr(nullptr, [](MyObject*) {});
// Move pointer from old to new non-deleting ptr
newPtr.swap(oldPtr);
QPointer qptr(newPtr.get());
但是,以这种方式,一旦函数结束,指针将被删除。大概,自定义脱机器与数据一起移动。