嗨我正在尝试将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";
}
谢谢大家,伙计们!
答案 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
这经常解决这个问题。如果我没有帮助你必须在你的代码中找到其他问题。