- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们的应用程序设计得非常糟糕 - 它同时使用了 std::shared_ptr
和 QObject
父子关系来管理我们的一些对象。当 QObject::~QObject
时,这会导致段错误删除其子对象然后 shared_ptr
也尝试删除它。
我们讨论过这个问题,但目前没有办法轻松解决这个问题,所以在我们解决它之前,我需要使用一些肮脏的技巧。
现在我有一个 std::shared_ptr<MyObject> getMyObjectPtr()
功能。我需要将结果放入 QPointer<MyObject>
- QPointers 是弱指针,仅指示它们管理的 QObject 是否已删除。我无法以任何方式更改该功能,否则会破坏整个应用程序。
我尝试了一些自定义解除分配器的 hack,但似乎没有用。
// get the shared_ptr from inacessible API
std::shared_ptr<MyObject> oldPtr(getMyObjectPtr());
// create a new pointer that never deletes it's value
std::shared_ptr<MyObject> newPtr(nullptr, [](MyObject*) {});
// Move pointer from old to new non-deleting ptr
newPtr.swap(oldPtr);
QPointer<MyObject> qptr(newPtr.get());
但是,一旦我的函数结束,指针就会被删除。据推测,自定义解除分配器会随着数据一起移动。
最佳答案
我认为这个问题没有任何好的解决方案,除了开始重构您的代码,以便通过 QObject 样式的父/子关系管理任何给定对象,或 shared_ptr <> 引用计数——但绝不会在同一个对象中。这两种方法彼此差异太大,无法轻松调和。
就是说,为了在不进行过多重新设计的情况下实现上述目标,您可以做的一件事是:与其使用指向您的 QObject 的 shared_ptr<>,不如让shared_ptr 指向 QObject 的(非基于 QObject 的)shared_ptr 管理的子对象。
也就是说,不是这样的:
class MyQObject : public QObject
{
public:
MyQObject(int x, int y, int z, QObject * parent)
: QObject(parent), m_x, m_y, m_z {/* empty */}
int getX() const {return m_x;}
int getY() const {return m_y;}
int getZ() const {return m_z;}
private:
int m_x, m_y, m_z;
};
[...]
QObject * parent = new QObject;
shared_ptr<MyQObject> ptr(new MyQObject(1,2,3,parent)); // d'oh! trouble!
做这样的事情:
class MyData
{
public:
MyData(int x, int y, int z) : m_x(x), m_y(y), m_z(z)
int getX() const {return m_x;}
int getY() const {return m_y;}
int getZ() const {return m_z;}
private:
int m_x, m_y, m_z;
};
class MyQObject : public QObject
{
public:
MyQObject(int x, int y, int z, QObject * parent)
: QObject(parent), m_data(make_shared<MyData>(x,y,z)) {/* empty */}
int getX() const {return m_data->getX();}
int getY() const {return m_data->getY();}
int getZ() const {return m_data->getZ();}
shared_ptr<MyData> getData() {return m_data;}
private:
shared_ptr<MyData> m_data;
};
[...]
QObject * parent = new QObject;
QObject * myObj = new MyQObject(1,2,3,parent));
shared_ptr<MyData> ptr(myObj->getData()); // no problem!
这样,您的 Qt 样式代码就可以访问 QObject 和 MyData,而 shared_ptr 样式代码可以访问 MyData。 (当然,如果您的 shared_ptr 样式代码还需要访问 QObject 本身,您可能就不走运了,因为 Qt 将决定何时何地删除 QObject,并且不会遵守 shared_ptr 语义)
关于c++ - 将 std::shared_ptr 转换为 QPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44885112/
QPointer有一个方法, clear() . Clears this QPointer object. 我不确定“清晰”的确切含义。在我看来,这可能意味着 它会删除您引用的指针。 或 它取消附加您
我有一个 Qt 应用程序,它使用 QPointers 来显示新的 UI 对话框(小部件)。主应用程序可以有许多加载不同数据的相同小部件。我遇到的问题是删除和释放每个小部件的内存。如果我监视程序的 RA
我正在编写一个表达式解析库。它是用Qt写的,我有这样一个类结构: QCExpressionNode-表达式所有部分的抽象基类 QCConstantNode-表达式中的常量(扩展QCExpression
我正在创建一个对话框窗口,想知道如何将指向 MainWindow 的指针传递给它? 例如,我需要从对话框中的 MainWindow 访问一个 getter 方法。 MainWindow 声明直接来自向
假设我有一个像下面这样的类: #include #include class MyClass: public QObject { private: QPointer m_process{
抱歉标题有点奇怪,如果你能想到一个更好的,请随意想出一个。 这是我的问题。 我有一个看起来像这样的结构: QObject -> MyBase -> MyDerived 然后我有一个函数将任何派生类型作
如何检查指针的内容是否被删除?如果我这样使用 QPointer: myClass::myClass(myStruct* p){ _p = p;//_p is a QPointer } myClass
根据 SGI's doc on associative containers ,“由于元素是根据它们的键存储的,因此与每个元素关联的键是不可变的”至关重要。我有时使用指针作为 std::map 的键,
我们的应用程序设计得非常糟糕 - 它同时使用了 std::shared_ptr和 QObject父子关系来管理我们的一些对象。当 QObject::~QObject 时,这会导致段错误删除其子对象然后
boost::bind 以与原始指针相同的方式处理 boost::shared_ptr。 QObject * object(new QObject); boost::shared_ptr shared
我有几个属性类型为 QList 的类.我使用原始指针来表示所有权。此访问器将返回 QList>因为我们不想分发原始指针。问题是目前每个访问器或多或少看起来像下面这样: QList> values; C
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我已阅读有关 QPointer、QSharedPointer 和 QWeakPointer 类的 Qt 文档。它说: QPointer 是一个模板类,它提供指向 Qt 对象的 protected 指针
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我是一名优秀的程序员,十分优秀!