存储指向 std::string 数据的指针是否安全?

2023-12-21

我的问题围绕复制构造和重新分配的机制。

我有一堂课,收集字符串。将字符串添加到集合后,该字符串将被复制并存储在向量中。但因为我还需要访问所有字符串的集合const char * const*,我还通过以下方式存储指向每个字符串数据的指针.c_str().

class MyStrings {
private:
    std::vector<std::string> names;
    std::vector<const char*> cStringPointers;
public:
    const char *const *Data() const
    {
        return this->cStringPointers.data();
    }

    void Add(const std::string &name)
    {
        // copy [name] and store the copy in [this->names].
        this->names.push_back(name); 
        // Store the pointer to the data of the copy.
        this->cStringPointers.push_back(this->names.back().c_str());
    }
}

我知道,存储指向向量元素的指针是不好的,因为当向量调整大小时,即必须重新分配其内存时,这些指针将不再有效。

但我只存储指向数据的指针。所以这就是我的想法:

If names调整大小后,它将移动构造它包含的所有字符串,因此这些字符串不会分配新的内存,而是仅使用已分配的内存,因此我的指针cStringPointers仍然有效。

我现在的问题很简单:我是否错过了一些会使该代码不安全或导致未定义行为的东西?

(假设我不使用任何奇特的架构和/或编译器。)


我现在的问题很简单:我是否错过了一些可以让 这段代码不安全或导致未定义的行为?

是的:您错过了小字符串优化。它是标准允许的并被广泛实施,并且会导致悬空指针作为字符串actually将他们的数据移动到新位置。

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

存储指向 std::string 数据的指针是否安全? 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 尝试获取数据来创建菜单,getStaticProps 返回未定义

    我正在使用 Next js 13 和 Strapi 我想做一个Menu组件使用getStaticProps 我创建并添加了一个Layout组件中的 app js And a Menu里面的组件Layout 我测试了里面的代码getStati
  • 如何找到检测到的霍夫线的角度?

    我的目标是使用开放CV 检测骨折的骨头 我尝试了以下代码 并获得了正确的精明检测边缘 还找到了粗糙线 但现在我的工作是检测图像中的断裂点 我不明白如何进一步进行 在一些博客中 我发现我们可以确定粗糙线的角度来检测该线是否是直的 但不知道如何
  • 如何从 Twitter Bootstrap 中删除未使用的样式?

    我的引导样式表大小约为 120kb 但我只使用了 25 的样式表代码 我不想要那个 span 类 我通过在引导程序中自定义它来尝试它自定义页面 http twitter github com bootstrap customize html
  • 使用Dataadapter更新时出现DBConcurrency异常

    我正在尝试编辑DataTable填充者NpgsqlDataAdapter 打电话后Fill 方法 我只有一行DataTable 然后我只更改了一列的值并尝试更新如下 然后我收到这个错误 发生 DBConcurrencyException 我
  • 使用实体框架时为 Select() 创建通用选择器

    我想创建一个函数来检索给定属性名称的类型的列表 但我还不知道如何创建一个有效的 lambda 选择器 public IList GetDistinctListOfProperty string propertyName var propIn
  • 如何渲染祖先树视图的嵌套 ul 列表

    我想使用 content tag 渲染如下所示的结构 其中集合是祖先对象 ul li a Fruits a ul li a Apple a li li a Orange a li ul li li a Colours a li ul 我相信
  • 带有 Spring 的 JDBC 缓慢元数据获取 Oracle

    我正在使用春天JdbcUtils extractDatabaseMetaData 方法来分析数据库 该函数调用回调并移交DatabaseMetaData目的 该对象提供了getColumns String catalog String sc
  • server.xml 中的环境/系统变量

    如何在 tomcat server xml context xml 等配置文件中使用环境 系统变量 我尝试使用 ENV VAR NAME 环境变量和系统变量 env ENV VAR NAME 对于环境变量 似乎什么都不起作用 它是如何在我的
  • 通过代码使用锚预设定位 UI 元素

    当我们在 Unity 中定位 UI 元素时 我们会通过锚点预设来修复位置 以便将其位置正确放置在画布上 我们选择顶部 中间 底部 拉伸和蓝色点 如果我在 C 代码中创建 UI 元素 我该如何做同样的事情 I make Texture2D t
  • 将基于“sh 1.11”的代码移植到 Windows

    所有迹象似乎都表明我的脚本可以在 Linux 环境中完全运行 据我所知 唯一阻止它在 Windows 中运行的是我使用sh https pypi python org pypi sh 这非常简单 from sh import convert
  • Swift:AnyObject 转换为 Float 失败

    let json left 18 deadline May 10 progress 0 6 as String AnyObject let ss json progress as Float let sss json progress as
  • 访问子类父类中重写的类变量

    如何访问我希望子类替换的类变量 这就是我想要实现的目标 class Foo var Foo staticmethod def print var print Foo var class Bar Foo var Bar gt gt Bar p
  • Neo4django 关系属性

    因此 我尝试使用 Django 在 Neo4j 中建模小型用户组关系 我目前正在使用 Neo4django python 包here https github com scholrly neo4django 现在 我有代表我的用户的节点 代
  • Runspace 忽略自定义 PSHostUserInterface

    的背景 我正在编写一个以编程方式执行 PowerShell 脚本的应用程序 该应用程序有一个自定义PSHost实现允许脚本输出日志记录语句 目前 我看到的行为是some请求已正确转发给我的自定义PSHost而其他人则完全被忽视 当我开始检查
  • 路由错误 - 没有新的路由与 [POST] 匹配

    我遇到了路由错误 并且找不到问题出在哪里 我正在创建一个简单的 CRUD 并通过 create 方法遇到此问题 Error 没有路由匹配 POST usuarios new 控制器 def new usuario Usuarios new
  • Javascript 在一定时间后关闭弹出窗口

    嗨 首先我不懂 JavaScript 因此 我的主页上有一个弹出窗口 其中包含对客户的圣诞祝福 我希望弹出窗口在 20 秒后关闭 我从互联网上获得了以下代码 弹出窗口可以正常打开 但我需要以下方面的帮助 我在哪里输入弹出窗口的时间限制和 我
  • CRONTAB 语法错误

    这是我的 CRONTAB 文件 Ubuntu 10 10 57 1 2 6 ET date date yesterday Y m d echo ET 甚至语法颜色也表明有问题 并且有这个错误 Subject Cron
  • VS Code 有没有办法缩进到左括号?

    我希望修改 VS Code 的缩进行为 这样如果我在输入如下行后按 Enter 键 variable function param1 它将缩进到左括号的水平 以便我可以轻松地格式化代码 如下所示 variable function para
  • 如何在 Aurelia 中设置复选框绑定

    我有一个复选框列表 当用户选中其中一个复选框时 会在 js 文件中调用一个函数 然后调用一个方法 dataservice js 来调用 webapi 控制器 这一切都工作正常并返回正确的数据 当该过程完成时 会发生的情况是触发序列的复选框未
  • 存储指向 std::string 数据的指针是否安全?

    我的问题围绕复制构造和重新分配的机制 我有一堂课 收集字符串 将字符串添加到集合后 该字符串将被复制并存储在向量中 但因为我还需要访问所有字符串的集合const char const 我还通过以下方式存储指向每个字符串数据的指针 c str