0

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

比较时间频道.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;

 };

比较时间通道.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";
        }

谢谢大家,伙计们!

4

3 回答 3

0

您应该在构造函数中初始化部分。注释行是非常错误的。

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

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

关于评论的编辑:

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

编辑关于异常: 正如我所说,问题很可能是共享指针没有设置为任何有趣的东西。当 SP 被销毁时,它会调用必须存在的内容的析构函数,否则会引发读取访问冲突,这将解释症状。

于 2013-03-06T13:44:04.720 回答
0
//_sections = *new QList< QSharedPointer<core::ITrackSection> > ();

你不应该做这样的事情。这会在堆上创建一个新的 QList 实例,它永远不会被删除,所以你有内存泄漏
你应该这样做

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

相反,这将是合法的。但最简单的方法是使用这样的复制分配

_sections = sections

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

于 2013-03-06T13:51:05.273 回答
0

这你展示的应该工作。你的问题出在其他地方。
这类问题可能是由许多不同的错误引起的,例如:static_castc-style cast 错误或错误,使用动态库时二进制兼容性中断,表外写入,编译器缓存问题(这种情况经常发生因为在下面)。

首先我会尝试做的事情:

make clean
qmake
make

这经常解决此类问题。如果我不能帮助您,您必须在您的代码中找到其他问题。

于 2013-03-06T14:27:07.273 回答