【发布时间】:2014-09-02 14:36:52
【问题描述】:
我正在使用 QSettings 来存储指向自定义类的指针列表,但是当我尝试从 QSettings 回读时出现内存错误。我做了以下事情:
-
将我的自定义类声明为元类型:
Q_DECLARE_METATYPE(QCustomAction*) Q_DECLARE_METATYPE(QList<QCustomAction*>) -
将自定义类注册为元类型及其运算符:
qRegisterMetaType<QCustomAction*>("QCustomAction*"); qRegisterMetaTypeStreamOperators<QCustomAction*>("QCustomAction*"); qRegisterMetaType<QList<QCustomAction*>>("QList<QCustomAction*>"); qRegisterMetaTypeStreamOperators<QList<QCustomAction*>>("QList<QCustomAction*>"); -
重载流操作符:
QDataStream &operator<<(QDataStream &out, QCustomAction* const obj) { out << obj->m_actionName << obj->m_lastIndex; return out; } QDataStream &operator>>(QDataStream &in, QCustomAction* obj) { in >> obj->m_actionName >> obj->m_lastIndex; return in; }
之后,我的代码编译没有错误,我可以通过调用保存列表:
myQSettings.setValue("ActionsList",QVariant::fromValue<QList<QCustomAction*>>(someList));
我将这些值读为:
someList = myQSettings.value("ActionsList").value<QList<QCustomAction*>>();
读取值时出现内存错误。我的猜测是重载运算符存在一些问题。谁能告诉我我做错了什么?
【问题讨论】:
-
读取数据时,
"ActionsList"是否已经包含有效指针列表?最多和你写的列表一样多吗? -
当我写这个列表时,它已经包含了一些有效的指针。 ini 文件有一些奇怪的符号。当我尝试读取设置时,列表为空。
-
那么这很可能是你的问题,因为阅读可能不会在列表中创建对象。
-
那么在这种情况下我应该避免使用指针吗?
-
保存指针是没有意义的,并且在尝试读取此类数据时总是会导致崩溃!了解对象的内化和外化。