为什么const QString& param返回bad const char *指向数据的指针

时间:2017-05-25 14:33:13

标签: c++ qt c++11 pointers

找出有趣的错误:当我传递const QString&参数然后获取const char*指针指向存储在const QString&内的数据时,指针指向坏数据(某些字符看起来不像我发送到功能)。

LogbookNote LBHasher::makePropsFromPseudoElement(const QString& id)
{
   LogbookNote rv;
   if (m_ctx->currentTrim) {
    const char* charId = id.toLatin1().data();
    ...
    qDebug() << charId;
}

并致电代码:

LogbookNote LBHasher::makePropsByNameConvention(QString id)
{
   LogbookNote g;
   if (id.startsWith("_ctx_")) {
       g = makePropsFromPseudoElement(id);
 ...
 }

正如您所提到的,调用方法ID为QString,即QString对象的完整副本。因此const QString&可以是一个强大的(没有破坏,删除的临时对象)参考。

为什么会出现这种行为?

2 个答案:

答案 0 :(得分:4)

id.toLatin1()创建一个临时QByteArray实例。然后,您将指针存储到该临时管理的缓冲区。在分号处,临时被摧毁,指针悬空;稍后使用该指针会显示未定义的行为。

答案 1 :(得分:3)

QString::toLatin1按值返回py -3 -m pip install praw,这意味着它是一个临时对象。那个QByteArray在该行的末尾被破坏(完整表达式),留下指向无效对象的指针并使用它是未定义的行为。