C++ 字符串文字的安全性和可靠性如何?

2023-11-26

所以,我想更好地掌握 C++ 中的字符串文字是如何工作的。我最关心的是您将字符串文字的地址分配给指针并传递它的情况。例如:

char* advice = "Don't stick your hands in the toaster.";

现在假设我只是在程序运行期间通过复制指针来传递这个字符串。当然,这可能不是一个好主意,但我很好奇幕后到底发生了什么。

再举个例子,假设我们创建一个返回字符串文字的函数:

char* foo()
{
    // function does does stuff
    return "Yikes!"; // somebody's feeble attempt at an error message
}

现在假设这个函数被频繁调用,而字符串文字仅在调用的一半时间中使用:

// situation #1: it's just randomly called without heed to the return value
foo(); 

// situation #2: the returned string is kept and used for who knows how long
char* retVal = foo();

在第一种情况下,实际发生了什么?该字符串是否刚刚创建但未使用,并且从未释放?

在第二种情况下,只要用户发现需要该字符串,该字符串就会一直保留吗?当不再需要它时会发生什么...该内存会被释放吗(假设没有任何东西再指向该空间)?

不要误会我的意思,我不打算使用这样的字符串文字。我计划使用一个容器来检查我的字符串(可能是 std::string )。我主要只是想知道这些情况是否会导致内存管理或数据损坏问题。


字符串文字的类型为const char[N] (where N是长度+1)并且是静态分配的。您不必担心内存问题;如果您的程序中使用了字符串,那么它会为您处理,并驻留在程序内存中的某个位置(通常是只读的)。

也就是说,这些是“相同的”:

static const char str[] = "a string";
"a string"

当您指向字符串文字时,您将指向数组中的第一个字符。事实上,因为类型是const char[],只有通过以下方式指向它才是安全的const char*。从字符串文字到的转换char*已被弃用且不安全。

// the "same"
static const char str[] = "a string";
const char* strPtr = str; // decays

const char* s1 = "a string";
char* s2 = "a string"; // allowed, implicit const_cast

*s1 = 'A'; // not allowed, it's const
*s2 = 'B'; // allowed, it's not const (but leads to undefined behavior)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 字符串文字的安全性和可靠性如何? 的相关文章

随机推荐

  • Spark RDD 到 DataFrame python

    我正在尝试将 Spark RDD 转换为 DataFrame 我已经看过该方案传递给的文档和示例sqlContext CreateDataFrame rdd schema 功能 但我有 38 个列或字段 并且还会进一步增加 如果我手动给出指
  • CakePHP 中的 GROUP 和 COUNT() 年龄

    我正在尝试使用 CakePHP 按出生日期进行分组并根据结果进行计数 这是我的查询 data this gt User gt find all array fields gt array DATE FORMAT NOW Y DATE FOR
  • CKEditor 剥离 标签

    我正在尝试找到一种解决方案来避免使用 CKEditor 但旧版 FCKeditor 也会删除任何内容 i 将之前插入的内容标记到数据库中 Case 我将 html 内容插入到数据库中 一些内容包含 i 元素 我使用 CKEditor 来完成
  • Jquery mobile:单击时更改主题

    我有一个主题为 a 的基本列表 我正在尝试找到一种在单击按钮时更改主题的方法 试过 a li attr data theme a 与列表刷新相结合 但没有运气 成功了吗 您必须在页面中搜索所有 ui body ui button up ui
  • 如何在 AngularJS 中编写指令

    我喜欢使用指令制作自定义组件 我检查了很多教程 它让我感到困惑 任何人都可以解释指令是如何工作的 我计划制作的组件是
  • Android:MediaPlayer setVolume 函数

    关于参数 设置什么让播放器没有声音和全声音 Thanks 这个功能其实很精彩 多亏了它 您可以创建具有任意数量步骤的体积比例 假设您需要 50 个步骤 int maxVolume 50 然后要将 setVolume 设置为该范围 0 49
  • 如何使用android支持库中的Chips组件?

    我已阅读有关的文档官方网站 但我无法按照文档在我的项目中实现 Chip Android Studio 找不到并导入Chip类以及Chip view 我还注意到谷歌开发者网站Chip类没有参考 还有一些类似的问题 但所有答案都指向使用第三方库
  • 保存反应文件时 Visual Studio 代码错误?

    And when i am saving this file with Ctrl s even using prettier and other javascript extension snippets in visual code i
  • 为什么 TensorFlow 返回 [[nan nan]] 而不是 CSV 文件中的概率?

    这是我正在使用的代码 我正在尝试在真实的测试集中获得 1 0 或希望结果的概率 当我只是分割训练集并在训练集上运行它时 我得到了大约 93 的准确率 但是当我训练程序并在实际测试集 第 1 列中没有填充 1 和 0 的测试集 上运行它时 它
  • 如何解决使用 AsyncStorage(已弃用)警告?使用社区(正确)库

    我正在使用 react native community async storage 并不断收到此警告 Warning Async Storage has been extracted from react native core and
  • 如何解决 TypeError: 'float' 对象不可迭代

    我怎样才能转移 A 0 12075357905088335 0 192198145631724 0 9455373400335009 0 6811922263715244 0 7683786941009969 0 0331122279846
  • Amazon EC2 中的 HTTPS 设置

    我们如何在 Amazon EC2 中启用 HTTPS 我们的网站正在 HTTP 上运行 首先 您需要打开 HTTPS 端口 443 为此 您可以访问https console aws amazon com ec2 并单击Security G
  • 从 Gradle 中的 Url 编译 Jar

    是否可以做类似的事情 compile files http ho st jar MyLibrary jar 在 Gradle Android Studio 中 可能的优点 始终获取最新版本 如果必须手动下载并复制 则并不总是拥有最新版本 即
  • Angular 模块联合 BrowserModule

    我正在使用 webpack5 和 CLI11 开发模块联合原型 主要如下所述 https www angulararchitects io aktuelles the microfrontend revolution part 2 modu
  • 订阅 WCF 服务中的事件

    我需要对 WCF 服务的功能进行一些实时报告 该服务在 Windows 应用程序中自托管 我的要求是当客户端调用某些方法时向主机应用程序报告 实时 我对该任务的最初想法是在服务代码中发布 NotifyNow 事件 并在我的调用应用程序中订阅
  • 如何备份sqlite数据库?

    正确的做法是什么 我只复制 sq3 文件吗 如果网站上有用户并且文件在复制时正在写入怎么办 sqlite3 命令行工具具有以下功能 backup点命令 您可以通过以下方式连接到您的数据库 sqlite3 my database sq3 并运
  • C# 中的 [Serialized] 和 [Serialized()] 之间有区别吗?

    我遇到过使用这两种表示法的示例 我找不到任何关于它的信息来说明哪一个是常见的 为什么允许使用两种符号 以及两者之间是否确实存在任何细微的差异 有人有主意吗 不 没有功能差异 你问为什么有两种不同的风格 为了简洁起见 允许使用第一个符号 允许
  • Lastpass 如何知道 Chrome 中当前的 URL

    在 Android 版 Chrome 中浏览时 如果 Lastpass 将 URL 识别为与您关联的登录详细信息 则会弹出建议 它如何知道 Chrome 正在查看哪个 URL 我知道 Lastpass 使用无障碍服务 但我想知道它如何从 C
  • google.protobuf.Empty 对于向后兼容性有危险吗?

    The spec for google protobuf Empty states 可以重复使用的通用空消息 以避免定义重复 API 中的空消息 一个典型的例子就是用它作为请求 或 API 方法的响应类型 我一直在内部提倡使用空消息包装器来
  • C++ 字符串文字的安全性和可靠性如何?

    所以 我想更好地掌握 C 中的字符串文字是如何工作的 我最关心的是您将字符串文字的地址分配给指针并传递它的情况 例如 char advice Don t stick your hands in the toaster 现在假设我只是在程序运