【问题标题】:Stream Operator Overload with pointers带指针的流运算符重载
【发布时间】: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 文件有一些奇怪的符号。当我尝试读取设置时,列表为空。
  • 那么这很可能是你的问题,因为阅读可能不会在列表中创建对象。
  • 那么在这种情况下我应该避免使用指针吗?
  • 保存指针是没有意义的,并且在尝试读取此类数据时总是会导致崩溃!了解对象的内化和外化。

标签: c++ qt operators


【解决方案1】:

让我解释一下。

例如:如果你保存一个 int,Qt 会从你那里获取一个 int,它会以某种方式将该 int 存储到磁盘(通过操作员)。另一方面,在加载时,Qt 将创建一个 int,从磁盘(通过运算符)加载它的值并将该 int 返回给您。

对于您的指针,Qt 将尝试以相同的方式执行此操作:Qt 将从您那里获取一个指针,并将该指针以某种方式存储到磁盘(由您的操作员 - 访问 object对应于该指针)。另一方面,Qt 在加载时会创建一个未初始化的指针,并会尝试从磁盘(由您的操作员)加载其值并将其返回给您。然而,它需要做的是创建一个对象来初始化指针。

您不能通过指针/引用存储/加载对象。始终只存储/加载 按值复制 对象!尝试将您的操作转换为按值复制的对象并存储/加载那种类型的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多