一些你最初的陈述是不完全正确的:
对于char *
和char []
例如,在两种情况下,变量本身,str
仍然在范围和访问,直到它是否在全局命名空间被声明的程序结束。
如果它在函数或方法的作用域中声明,那么在范围保持活动状态时它是可访问的。两个都。
至于用于存储实际文字字符串的内存实际发生了什么,这是未指定的。只要结果符合C++标准,特定的C++实现就可以以任何更方便的方式管理运行时内存。就C++而言,您没有访问str
对象所使用的内存,而只是引用str
对象本身。
当然,你可以自由地拿一个原生char *
指针,指向str
中的一个字符。但是,指针是否有效直接与底层对象的范围相关联。当对应的str
对象超出作用域时,指针不再有效,访问指针的内容变为未定义的行为。
请注意,在str
位于全局命名空间的情况下,str
的范围是程序的生命周期,因此该点没有实际意义。但是,str
在本地范围内,并且超出范围时,使用指针变成未定义的行为。底层内存会发生什么变化是无关紧要的。 C++标准并没有真正定义底层实现中内存应该或不应该发生什么,但是什么是或者不是未定义的行为。
基于此,您几乎可以自己找出std::string
个案的答案。这是同一件事。您正在访问std::string
对象,而不是基础内存,并且适用相同的原则。
但是请注意,除了范围问题外,std::string
对象的一些方法(但并非全部)也被指定为使所有现有的直接指针和迭代器都无效到其内容,因此这也会影响是否a将char *
指定给std::string
中的其中一个字符仍然有效。
字符串文字具有“静态”存储持续时间,所以它**总是**在程序的整个生命周期中都存在。 –
'std :: basic_string'不拥有文字,因此它的生存期不是由'str'确定的。 – edmz