繁体   English   中英

使用 std::string::c_str() 修改底层 std::string 是否安全?

[英]Is it safe to use std::string::c_str() to modify the underlying std::string?

我遇到了一些代码,其中包含以下示例的几个实例:

std::string str = "This  is my string";
char* ptr = const_cast<char*>(str.c_str());

ptr[5] = 'w';
ptr[6] = 'a';

在这个简化的示例中,使用const_cast将返回const char*std::string::c_str()赋值给char*指针。

这似乎按预期工作,并相应地修改了str

但是我本地库中std::string::c_str()的描述如下:

返回指向空终止内容的常量指针。 这是内部数据的句柄。 不要修改,否则可能会发生可怕的事情

cppreference 中,描述包括:

返回一个指向空终止字符数组的指针,该数组的数据与存储在字符串中的数据等效。

...

写入通过c_str()访问的字符数组是未定义的行为。

在标准的[string.accessors] 中,描述是相似的,并且没有提供关于这个...以空字符结尾的字符数组的信息,其数据等同于存储在字符串中的数据...。

这不是澄清问题,而是让我更加困惑,什么字符数组? 它是如何等效的? 是副本吗? 如果是这样,为什么要修改它,还要修改原始字符串? 这个实现定义了吗?

我想避免更改使用它的所有代码实例的任务,所以我的问题是:

有什么办法可以是正确的,使用ptr指针修改str字符串是否合法?

您引用的c_str参考资料对此事非常清楚:

程序不得修改存储在字符数组中的任何值; 否则,行为未定义。

它碰巧起作用的事实并不意味着什么。 未定义的行为意味着如果它愿意,程序可以做“正确”的事情。


如果您确实想修改底层数据,可以使用data()的非常量重载,它可从 C++17 获得,它允许您修改除空终止符之外的所有内容:

程序不得将存储在 p + size() 中的值修改为 charT() 以外的任何值; 否则,行为未定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM