【问题标题】:Why const QString& param return bad const char* pointer to data为什么 const QString& 参数返回错误的 const char* 指向数据的指针
【发布时间】:2017-05-25 14:33:13
【问题描述】:

找出有趣的错误:当我传递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&amp; 可以是一个强引用(例如,对已删除的临时对象没有破坏)。

为什么会出现这种行为?

【问题讨论】:

  • 顺便说一句...qDebug() &lt;&lt; qPrintable( id )
  • 也许这个问题的标题需要更正?

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


【解决方案1】:

id.toLatin1() 创建一个临时的QByteArray 实例。然后,您存储指向由该临时管理的缓冲区的指针。在分号处,临时对象被销毁,指针悬空;稍后使用该指针会表现出未定义的行为。

【讨论】:

  • 好的,重点。但为什么这种行为只发生一次?意思是当我第二次调用这个代码时,指针工作得很好。
  • “似乎有效”是未定义行为的一种可能表现形式。
【解决方案2】:

QString::toLatin1 按值返回QByteArray,这意味着它是一个临时对象。 QByteArray 在该行的末尾被销毁(完整表达式),留下一个指向无效对象的指针,使用它是未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2016-06-10
    • 2021-05-08
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多