gpt4 book ai didi

c++ - QSharedPointer 不返回 false

转载 作者:行者123 更新时间:2023-11-30 01:17:05 26 4
gpt4 key购买 nike

我现在有这样的东西

QSharedPointer<QMainWindow> cv;

这个共享指针用作

cV = QSharedPointer<QMainWindow>(new QMainWindow(p));
cV->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);
cV->show();

现在,如果我关闭 QMainWindow,则以下代码会使应用程序崩溃

if(cV)
cV->close(); //This pointer is no longer valid.

我的问题是,当我关闭cV QMainWindow 对象时(通过单击 的 x 按钮)为什么以下语句返回 true

if(cV)

如果窗口已关闭,我如何让它返回 false

最佳答案

共享指针不会神奇地知道您何时删除它指向的对象。手动删除生命周期由共享指针管理的对象是错误。由于窗口在关闭时会自行删除,因此您现在会得到悬挂的共享指针。

因此,您不能将 QSharedPointerQt::WA_DeleteOnClose 小部件一起使用。

您需要的是一个指针,用于跟踪小部件是否仍然存在。这样的指针是QPointer,它正是你所需要的。该指针旨在在 QObject 被销毁时将自身重置为零。

请注意,QPointer 是一个弱指针,当它超出范围时,它不会删除窗口。

如果您需要一个允许删除底层 QObject 的拥有指针,有一种方法可以做到:

template <typename T> class ScopedQObjectPointer {
Q_DISABLE_COPY(ScopedQObjectPointer)
QPointer<T> m_ptr;
inline void check() const {
Q_ASSERT(m_ptr && (m_ptr->thread() == 0
|| m_ptr->thread() == QThread::currentThread()));
}
public:
explicit ScopedQObjectPointer(T* obj = 0) : m_ptr(obj) {}
ScopedQObjectPointer(ScopedQObjectPointer &&other) : m_ptr(other.take()) {}
~ScopedQObjectPointer() { check(); delete m_ptr; }
operator T*() const { check(); return m_ptr; }
T & operator*() const { check(); return *m_ptr; }
T * operator->() const { check(); return m_ptr; }
T * data() const { check(); return m_ptr; }
T * take() { check(); T * p = m_ptr; m_ptr.clear(); return p; }
void reset(T * other) { check(); delete m_ptr; m_ptr = other; }
operator bool() const { check(); return m_ptr; }
};

由于我们允许通过指针以外的其他方式删除对象,因此从多个线程访问对象是错误的。如果要在另一个线程中删除该对象,则在 null 检查和使用取消引用的对象之间存在竞争条件。因此,QPointerScopedObjectPointer 只能在对象的线程中使用。这是明确断言的。 Q_ASSERT 成为发布版本中的空操作,并且在那里没有性能影响。

关于c++ - QSharedPointer 不返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com