基于范围的临时对象

2024-01-11

我知道,一般来说,基于范围的临时对象的生命周期for循环扩展到整个循环(我读过C++11:基于范围的 for 语句:“range-init”生命周期? https://stackoverflow.com/questions/9657708/c11-the-range-based-for-statement-range-init-lifetime)。因此,这样做通常是可以的:

for (auto &thingy : func_that_returns_eg_a_vector())
  std::cout << thingy;

现在,当我尝试做一些我认为与 Qt 类似的事情时,我遇到了内存问题QList容器:

#include <iostream>
#include <QList>

int main() {
  for (auto i : QList<int>{} << 1 << 2 << 3)
    std::cout << i << std::endl;
  return 0;
}

这里的问题是 valgrind 在某处显示无效的内存访问QList班级。但是,修改示例以便将列表存储在变量中可以提供正确的结果:

#include <iostream>
#include <QList>

int main() {
  auto things = QList<int>{} << 1 << 2 << 3;
  for (auto i : things)
    std::cout << i << std::endl;
  return 0;
}

现在我的问题是:在第一种情况下我是否做了一些愚蠢的事情导致例如未定义的行为(我没有足够的阅读 C++ 标准的经验来自己回答这个问题)?或者这是我使用方式的问题QList,或者如何QList已实施?


由于您使用的是 C++11,你可以使用初始化列表代替 http://doc-snapshot.qt-project.org/5.0/qlist.html#QList-3。这将通过 valgrind:

int main() {
  for (auto i : QList<int>{1, 2, 3})
    std::cout << i << std::endl;
  return 0;
}

该问题与基于范围的 for 甚至 C++11 并不完全相关。下面的代码演示了同样的问题:

QList<int>& things = QList<int>() << 1;
things.end();

or:

#include <iostream>

struct S {
    int* x;

    S() { x = NULL; }
    ~S() { delete x; }

    S& foo(int y) {
        x = new int(y);
        return *this;
    }
};

int main() {
    S& things = S().foo(2);
    std::cout << *things.x << std::endl;
    return 0;
}

无效读取是因为表达式中的临时对象S() (or QList<int>{}) 在声明后被破坏(遵循 C++03 和 C++11 §12.2/5),因为编译器不知道该方法foo() (or operator<<) 将返回该临时对象。所以你现在指的是释放内存的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于范围的临时对象 的相关文章

随机推荐

  • Zend Framework 2 包括自定义库

    我的目录结构是这样的 c 工作区 Zend c 工作区 自定义库 自定义库是一个共享库 可以在其他应用程序中使用 它不使用命名空间 仅使用旧式下划线 我下载了 ZF2 Restful Module Skeleton 打算将其用作静态服务器
  • 如何模拟类的内部方法?

    我有一个有内部方法的类 我想模拟内部方法 但我无法模拟它 即它不是调用模拟函数而是调用原始函数 有什么办法可以实现这一点吗 编辑 实际上我是最小起订量的新手 我有很多类和类的方法来使用最小起订量进行测试 许多类是内部的 许多有内部方法 许多
  • 为什么我的 GitHub 页面不更新其内容?

    我一直在关注官方指南 pages github com https pages github com 到目前为止 我已经创建了本地存储库并将其推送到 GitHub 但是 无论我做什么更改 我都可以在 GitHub 的存储库中看到它 但是no
  • IE 中的多行按钮

    我目前处于一种可怕的情况 需要我在两行上设置 按钮 类型的输入样式 按钮上的固定宽度会导致按钮内的文本在除 IE 之外的所有其他浏览器中换行 因此 我的问题是 如何指定 value Button to Wrap 的输入在 IE 中换行到两行
  • 如何判断在 Dock 上放置过程中是否按下了修饰键

    我的 Cocoa 应用程序支持将文件拖放到其 Dock 图标上 但我希望根据是否按住修饰键 Command Option 等 来实现不同的行为 我尝试检查modifierFlags为了currentEvent 但无论是否按住修饰符 它们都是
  • 当我获取脚本时终端关闭(在开始时使用点运行)

    这是我的代码 bin bash if 1 then exit 0 fi array cat 1 let b array 1 count 0 for i in 1 7 do for j in 30 37 do for n in 40 47 d
  • 三元运算符的右结合性

    std cout lt lt true high pass false fail pass 是相同的 std cout lt lt true high pass false fail pass 既然三元运算符是右结合的 为什么我们不先进行右
  • 为什么java的inputstream.close()会阻塞?

    我的 Java 程序使用 ProcessBuilder redirectErrorStream 设置为 true 并有一个循环运行进程的输入流的 read 方法 该方法是阻塞的 然后我调用的外部程序停止等待输入和标准输入 我现在想终止该进程
  • 在 Spring MVC 中使用 Jackson JSON 时如何默认启用 Pascal 大小写?

    我有一个使用 Spring MVC 创建和处理多个 REST 端点的项目 我目前正在使用 Jackson 自动处理 JSON 的序列化 反序列化 RequestBody and ResponseBody注释 我已经让杰克逊开始工作了 所以我
  • 将 cqlsh 与 ssl 结合使用

    我已经在我的 cassandra 节点中启用了 ssl 加密 并且我正在尝试弄清楚如何使用带有 ssl 的 cqlsh 连接到我的节点 当我跑步时 cqlsh ssl我收到以下错误 Validation is enabled SSL tra
  • 我们可以用 ES6 Generator 做哪些 for 循环做不到的事情?

    我深入了解了 ES6 功能 Generators 引起了我的注意 我突然想到的一件事是链接 Promise 对象 而我无法使用循环来做到这一点 我们还能做哪些以前做不到的其他机制 我确实明白这是一个广泛的问题 但目前我除了承诺之外什么也想不
  • G1垃圾收集器:为什么幸存者空间总是满的?

    这是输出jmap heap命令 Survivor Space regions 52 capacity 54525952 52 0MB used 54525952 52 0MB free 0 0 0MB 100 0 used 我已经执行了很多
  • 使用UniversalImageDownloader的ListView滚动不平滑

    我正在使用包含图像的 ListView 这些图像是从互联网加载到适配器内的 因此我正在使用通用图像下载器 不幸的是 当我向下滚动需要下载新内容的位置时 ListView 的滚动会短暂 滞后 我实际上期望像 ListView 这样的行为滚动完
  • GitHub 组织未出现在“持续部署”页面中

    我的个人 GitHub 帐户属于五个组织 从 GitHub 设置 Azure 持续集成时 五个组织中只有四个出现在列表中 我们尝试过登录和注销 GitHub 和 Azure 此外 我们尝试更改 Azure 中的帐户 然后重新添加相同的帐户
  • 按新指南随机排序

    为了从 Sql 查询中以随机顺序获取结果 我通常按新的 Guid 进行排序 我之前已经使用实体框架完成了此操作 但由于某种原因它现在不起作用 例如 使用 Adventureworks2008r2 数据库 我在 LinqPad 中运行以下查询
  • 如何使用 Javascript 将 cookie 存储在本地存储中?

    我有一个适用于 Android 希望以后还有 iPhone 的应用程序 它基于 Javascript 并使用 Phonegap Applaud 制作成应用程序 不幸的是 设置和获取 cookie 在 Android 上不起作用 这可能是 A
  • 内容仅在我单击时出现在页面上

    我已经通过 Angular 2 应用程序连接到 Firebase 3 没有什么特别的 只是一个包含一小部分数据的简单表 在我的 Angular 2 应用程序中 我在服务中创建了服务 我创建了一个侦听器事件 如下所示 getAddedBugs
  • 创建 JavaScript 自定义事件

    我想用 JavaScript 创建一个自定义事件 我有一个 WPF 应用程序 里面有一个 WebBrowser 还有一个带有 JavaScript 的 HTML 页面 我使用打印机工作 当打印机的状态发生变化时 它会触发 NET 中的事件
  • 将特色图像添加到 wp_nav_menu 项目

    这是一个自我问答 如何修改 wp nav menu 输出中出现的文本 html 例如 我想为页面和类别添加特色图像 您可以看到使用自定义步行器执行此操作的示例 但对于小的更改来说 代码非常复杂 当然有办法用过滤器来做到这一点吗 这是我在 W
  • 基于范围的临时对象

    我知道 一般来说 基于范围的临时对象的生命周期for循环扩展到整个循环 我读过C 11 基于范围的 for 语句 range init 生命周期 https stackoverflow com questions 9657708 c11 t