我有一个下面的代码片段.我期待输出将是mystring,但奇怪的是它输出垃圾字符.
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
string s1("mystring");
const char* s2 = s1.c_str();
s1 = "Hi there, this is a changed string s1";
cout << s2 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(1)我最初的想法是,c_str负责分配足够的存储空间来保存的s1,并返回其被分配到该内存块的地址s2,并从这里开始s1,并s2开始了独立.
(2)但当我s1 = "Hi there ..... "在(1)中指出我的想法被证明是错误的.不知何故,s1仍在影响着s2.
(3)当我注释掉s1 = "Hi there .... "线条时,一切正常,即mystring一致打印.
(4)我并不是真的相信我在(1)中的主张c_str是分配内存来保持s1,因为如果是这种情况,我们将不得不通过s2我们不做的指针来释放那个内存块.所以我不确定.
请帮我解释这个奇怪的行为.
use*_*894 11
引用cppreference:
获得的指针
c_str()可以通过以下方式无效:
- 在字符串上调用非const成员函数,不包括operator [],at(),front(),back(),begin(),rbegin(),end()和rend().
通过修改字符串,您不再具有有效指针.
而且,你的前提是错误的.没有内存分配/免费wrt c_str.c_str和data(在C++ 11中相同)返回指向底层存储的指针.它不拥有存储空间.当存储因任何原因发生变化时,您的指针不再有效(即,它现在可能指向垃圾).
s1.c_str()不返回独立的内存s1.更改以s1 使返回的指针无效s1.c_str().
换句话说要小心使用c_str.通常使用它将C字符串传递给不接受C++字符串的函数.
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |