Qt设计一个数据管理类,有一个QList成员,里面存放一些对象指针,为了多线程访问,还有一个QMutex成员。现在为了获取所有对象指针,设计了一个接口返回这些对象指针的列表,万一在其他线程里销毁了某各对象,就出问题了,怎么优化设计或避免这个问题?
时间: 2023-12-31 15:06:26 浏览: 78
QT 利用继承Qobject实现多线程
为了避免在其他线程中销毁了某个对象导致问题,可以将数据管理类中的对象指针封装为智能指针,例如使用 `QSharedPointer`。这样可以自动管理对象的生命周期,当某个对象在其他线程中被销毁时,也不会影响到其他线程中持有该对象指针的代码。
以下是一个使用 `QSharedPointer` 的示例代码:
```cpp
class DataManager : public QObject
{
Q_OBJECT
public:
DataManager(QObject *parent = nullptr)
: QObject(parent)
{}
void addObject(QObject *obj)
{
QMutexLocker locker(&m_mutex);
m_list.append(QSharedPointer<QObject>(obj));
}
QList<QSharedPointer<QObject>> getObjects() const
{
QMutexLocker locker(&m_mutex);
QList<QSharedPointer<QObject>> list;
for (const auto &obj : m_list) {
if (!obj.isNull()) {
list.append(obj);
}
}
return list;
}
private:
QList<QSharedPointer<QObject>> m_list;
mutable QMutex m_mutex;
};
```
在上面的代码中,我们将 `m_list` 中存放的对象指针封装为 `QSharedPointer<QObject>`,并且使用 `QMutexLocker` 来保护列表的访问。在 `getObjects` 函数中,我们遍历列表中的每个对象指针,如果该指针不为空,则将其转换为 `QSharedPointer<QObject>` 并添加到返回的列表中。这样就可以避免在其他线程中销毁了某个对象导致问题。
另外,如果在其他线程中销毁了某个对象,该对象指针所对应的 `QSharedPointer` 会自动引用计数减一,当引用计数为零时会自动删除该对象。因此,我们不必担心在其他线程中销毁了某个对象导致内存泄漏的问题。
阅读全文