string_view 真的会引发释放后使用错误吗?

2024-03-06

根据一篇文章(here https://alexgaynor.net/2019/apr/21/modern-c++-wont-save-us/ and there https://github.com/isocpp/CppCoreGuidelines/issues/1038)此代码是一个错误的 use-after free 示例:

#include <iostream>
#include <string>
#include <string_view>

int main() {
  std::string s = "Hellooooooooooooooo ";
  std::string_view sv = s + "World\n";
  std::cout << sv;
}

文章中指出,strings 将被释放时string_view用来!这违背了我的调试经验。但我要求你确认/验证/检查这一点。

根据我的经验,堆栈/作用域变量在作用域退出时被释放(调用析构函数将是更正确的措辞)。这意味着在这种情况下,这将发生在std::cout << sv;

不过我从来没用过string_view,所以我不知道这个对象的任何内部机制。

如果这确实是一种危险行为,你能解释一下吗? 否则,我很高兴阅读确认仅在当前作用域退出时调用作用域变量析构函数,或者在抛出异常时调用,从而中断当前作用域中的线程。


EDIT: 前两个答案之后,就真的是一个use-after-free的用法了。

附属问题:您认为我们可以在 string_view 的定义中添加一个带有 delete 关键字的移动构造函数来禁止这种情况吗?


这段代码的问题...

std::string_view sv = s + "World\n";

... 就是它sv未设置为s但对于一个无名的暂时的由表达式创建s + "world\n". That 暂时的整个表达式结束后(分号处)立即被销毁。

所以是的,这是一个“释放后使用”类型的错误。

如果你想延长它的寿命暂时的你必须将它分配给一个将维护它的变量 - 就像一个新的std::string object:

std::string sv = s + "World\n"; // copy the temporary to new storage in sv

A std::string_view只是字符串的“视图”,它本身不是字符串。仅当它“查看”的字符串有效时,它才有效。

这里还有另一个怪癖。您还可以绑定暂时的 to a const 参考这延长了临时的寿命:

std::string const& sv = s + "World\n"; // just keep the temporary living

为什么初始化一个std::string_view from a 暂时的允许吗?

我不能代表标准委员会发言,但我怀疑std::string_view预计将用作函数参数,以便可以将临时变量传递到函数中(就像使用 const ref 一样)。显然,生命周期对于这种情况来说是很好的。

如果我们禁止临时变量的初始化,那么主要使用std::string_view会被否定。你将被迫创建一个新的std::string(或绑定到 const ref)在调用函数之前使过程变得尴尬。

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

string_view 真的会引发释放后使用错误吗? 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • “附加到流程”作为构建后事件

    我有一个在 w3wp exe 进程下托管的应用程序 在调试时 我经常发现自己遵循以下步骤 1 做一些改变 2 构建项目 3 使用 工具 菜单下的 附加到进程 对话框附加到 w3wp exe 4 在应用程序中执行一些操作以使我的代码执行 这样
  • 有没有办法在Asp.net core中执行批量请求?

    我们有一个使用 ASP Net Core 构建的 API 出于性能原因 我们希望将多个请求合并为一个 HTTP 请求 在以前版本的 ASP NET 中 您可以通过以下方式允许批量请求默认HttpBatchHandler https www
  • MEF 和使用 NUnit 进行单元测试

    几周前 我加入了 MEF 组件模型 潮流 现在将它用于我的许多插件和共享库 总的来说 除了我经常犯的错误 导致调试过程令人沮丧 之外 它还是很棒的 无论如何 我的应用程序运行得很好 但我的 MEF 相关代码更改导致我的自动构建失败 我的大多
  • getter 和 setter 的 junit 测试方法

    我的项目中有很多java bean 我需要为它们生成一个 JUnit 测试类 使用 Eclipse 3 2 和 junit 4 4 生成的测试方法如下所示 public void testGetName fail Not yet imple
  • 地形条件资源

    我有以下内容 我想知道我做错了什么 因为我确信我不应该仅仅因为条件而将代码加倍 所以我想做 variable https value true resource aws security group http instance sg cou
  • 如何找到 numpy 矩阵中的最小值?

    嘿 这是一个快速而简单的问题 我如何找到这个矩阵的最小值 不包括 0 如 8 arr numpy array 0 56 20 44 68 0 56 8 32 56 0 44 68 20 56 0 当你使用numpy 你可以使用 arr ar
  • 使用可变宽度字体创建文本列

    我正在尝试为将在 MSN Messenger 上运行的 C 应用程序创建文本列 我很难让所有东西都排列整齐 这是我想要的输出的示例 1 Pizza Hut 123 Fake St 2 Domino s Pizza 123 Fake St 3
  • 运行时级别的 lambda 和方法引用有什么区别?

    我遇到过使用方法引用而不是 lambda 发生的问题 该代码如下 Comparator
  • HTML5 视频标签中的音频

    我注意到使用音频文件
  • 覆盖函数内部的全局变量不适用于 Spyder 4

    我尝试从函数内覆盖全局定义的数据框 不知何故 全局值不会改变 在函数内打印数据帧可以使用预期值 import pandas as pd rawData pd read csv music csv appTitles pd DataFrame
  • kubernetes 容器的响应丢失

    我已经在openstack上安装了kubernetes 该设置在 coreos 上有一个主节点和一个节点 我有一个在 UDP 端口 5060 上托管 SIP 应用程序的 pod 并且我已创建服务为NODEPORT在 5060 上 规格 sp
  • 如何在matlab中的imagesc图中添加图例

    我有以下代码 创建打印到文件的图形 f figure set gcf Visible off imagesc exp genes sorted cut h colorbar set gcf Colormap mycmap set gca x
  • Chrome 扩展选项卡 onUpdated 事件

    我正在构建一个 chrome 扩展 每次打开新选项卡并加载页面时都应该收到通知 为此我正在使用 chrome tabs onUpdated 事件 问题是 如果在某个域 具有 src 上托管的页面 选项卡上插入 iframe 则会触发 onU
  • 您可以在 Java EE Web 应用程序中实现 Vue.js 吗?

    我只是和我的同学一起开发一个工具 我们想使用 Vue js 作为 Web 界面 用于描述我们编程的内容 我们在 Eclipse 中开发了一个 Java EE Web 应用程序 我们使用 Tomcat 7 作为 Web 服务器 我搜索了很长时
  • Assert.Fail() 被认为是不好的做法吗?

    我在进行 TDD 时经常使用 Assert Fail 我通常一次进行一个测试 但是当我对稍后想要实现的事情有了想法时 我会快速编写一个空测试 其中测试方法的名称指示我想要以待办事项列表的形式实现的内容 为了确保我不会忘记 我在正文中放置了一
  • GWT maven编译器输出目录

    我需要使用 Maven 插件设置 GWT 编译器的输出目录位置 我研究了 GWT 编译器和 gwt maven plugin 文档 但没有找到任何选项 例如 我有两个名为editor and consolegwt maven plugin
  • javascript 使用 var 值作为新 var 的名称

    如何使用数组键 文本值 来引用同名变量 jsFiddle http jsfiddle net gBD4s var cr au gen bn fmt str var sbASCtrls cr ContentRating au Gold gen
  • 如何使用前向填充Python重新采样

    我的数据框 df3 看起来像这样 Id Timestamp Data Group Id 0 1 2018 01 01 00 00 05 523 125 5 101 1 2 2018 01 01 00 00 05 757 125 0 101
  • 为什么浏览器在 OSX 上渲染 rgba 的方式不同?

    我试图编写一些颜色操作代码 并在 alpha 上停留了很长一段时间 然后我 2 小时后 意识到浏览器以不同的方式渲染 rgba 我创建了这个测试 http jsbin com adekez 2 http jsbin com adekez 2
  • string_view 真的会引发释放后使用错误吗?

    根据一篇文章 here https alexgaynor net 2019 apr 21 modern c wont save us and there https github com isocpp CppCoreGuidelines i