我正在使用 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*>>();
读取值时出现内存错误。我的猜测是重载运算符存在一些问题。有人可以告诉我我做错了什么吗?
最佳答案
让我解释一下。
例如:如果您保存一个 int Qt 将从您那里获取一个 int 并以某种方式将该 int 存储到磁盘(通过运算符(operator))。另一方面,在加载时,Qt 将创建一个 int,从磁盘加载其值(通过运算符)并将该 int 返回给您。
对于您的指针,Qt 将尝试以相同的方式执行此操作:Qt 将从您那里获取一个指针,并以某种方式将该指针存储到磁盘(由您的运算符(operator)访问对象)对应于该指针)。另一方面,在加载时,Qt 将创建一个未初始化的指针,并尝试从磁盘加载其值(由您的运算符(operator))并将其返回给您。然而,它需要做的是创建一个对象来初始化指针。
您不能通过指针/引用存储/加载对象。始终仅存储/加载按值复制对象!尝试将您的操作转换为按值复制对象并存储/加载那种类型的对象。
关于c++ - 带指针的流运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626017/