用另一个提供QList

时间:2013-03-06 13:37:57

标签: c++ qt qlist

嗨我正在尝试将QList作为参数发送到另一个类但由于某种原因我得到了读取访问权限...

CompareTimeChannel.h

 class CompareTimeChannel : public IDataChannel
   public:

      // @brief The method used to receive the list
      void setData(const QList< QSharedPointer<core::ITrackSection> > & sections);

      // @brief The list
      QList< QSharedPointer<core::ITrackSection> > _sections;

 };

CompareTimeChannel.cpp

 // @brief Empty constructor
 CompareTimeChannel::CompareTimeChannel()
 {
 }

 void CompareTimeChannel::setData(const QList< QSharedPointer<core::ITrackSection> > & sections)
 {
     //_sections = *new QList< QSharedPointer<core::ITrackSection> > ();
     _sections.clear();
     _sections.append(sections);
 }

运行此代码会在Exception at 0x31cc78d, code: 0xc0000005: read access violation at: 0x4, flags=0x0

上抛出_sections.clear();

我之前尝试初始化列表(注释行_sections = *new QList<...>),但异常抛出相同。

非常感谢答案......

修改

好的,它已经修好了!

首先,就像@AndreasT所说,我必须初始化默认的QList构造函数。

然后,根据@ 10WaRRioR01的回答,问题来自于CompareTimeChannel,它在第一次调用该方法时未初始化。修正使用:

        CompareTimeChannel* chan = static_cast<CompareTimeChannel*>(channel);
        Q_ASSERT(chan);
        if (chan) {
            chan->setData(sections);
        }
        else {
            qDebug() << "Dynamic cast failure";
        }

谢谢大家,伙计们!

3 个答案:

答案 0 :(得分:0)

您应该初始化构造函数中的节。 评论说明的是错误的。

new在堆上构造List,然后使用*new取消引用,并且赋值隐式调用Heap上新列表的复制构造函数并将其复制到实例中。堆上的东西仍然是aruond,所以你刚刚创建了内存泄漏。

// @brief Empty constructor
 CompareTimeChannel::CompareTimeChannel()
:_sections()   // initialization default constructor.
 {
 }

关于评论的修改:

QList.clear()方法调用列表中每个元素的析构函数。至少有一个共享指针似乎没有正确初始化。如果您需要更多信息,请粘贴将内容放入_sections的代码。

编辑关于例外: 正如我所说,问题很可能是共享指针没有设置为有趣的东西。当SP被破坏时,它会调用其内容的析构函数,该内容必须存在,否则会抛出读取访问冲突,这将解释症状。

答案 1 :(得分:0)

//_sections = *new QList< QSharedPointer<core::ITrackSection> > ();

你不应该做这样的事情。这会在堆上创建一个新的QList实例,它永远不会被删除,因此您有内存泄漏 你应该已经完成​​了

_sections = QList< QSharedPointer<core::ITrackSection> > ();
相反,它是合法的。但最简单的方法是使用像这样的副本分配

_sections = sections

您遇到的问题很可能与您在_sections中的数据有关。也许你在null CompareTimeChannel对象上调用你的方法

答案 2 :(得分:0)

你展示的内容应该有效。你的问题出在其他地方 这种问题可能是由许多不同的错误引起的,例如:错误的static_cast或错误的c样式转换,在使用动态库时打破二进制兼容性,在表外写入,编译器缓存出现问题(这种情况发生)经常如此治愈,如下所述。

首先我会尝试做什么:

make clean
qmake
make

这经常解决这个问题。如果我没有帮助你必须在你的代码中找到其他问题。