C++ 为什么我仍然可以在string的作用域之外访问std::string::c_str()返回的char指针?

C++ 为什么我仍然可以在string的作用域之外访问std::string::c_str()返回的char指针?,c++,string,cstring,C++,String,Cstring,字符串指针pp是临时的,为什么在我删除指针后仍然正确地删除c_str #include <string> #include <iostream> using namespace std; int main(){ const char* tt = NULL; { string * pp = new string("big"); tt = pp->c_str(); cout << "tt->pp:\t" &

字符串指针
pp
是临时的,为什么在我删除指针后仍然正确地删除c_str

#include <string>
#include <iostream>
using namespace std;
int main(){
    const char* tt = NULL;
    {   
    string * pp = new string("big");
    tt = pp->c_str();
    cout << "tt->pp:\t" << tt << endl;
    delete pp; 
    }   
    cout << tt << endl;
    return 0;
}

这是不对的。完全​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

未定义的行为/线程。提到的副本不是一个,因为它是关于访问局部变量的。这个问题是关于访问释放的内存。@OlafDietsche:超出范围的局部变量实际上是释放的内存。复制品是正确的,如果你读了它,你会逐渐理解为什么会这样。@LightnessRacesinOrbit一点也不,也许我应该更详细地描述那些装傻的人。这里的错误是访问释放的堆内存。@OlafDietsche:选择哪个物理位置来存储
std::string
数据有什么关系?它超出了范围。OP询问他为什么仍然可以阅读它,而不是得到一个分段错误或其他错误。这是一样的,我知道这是不好的。我会问,当我预期会出现错误或分段错误时,为什么程序会成功输出。c_str是在堆中还是在堆栈上?@ridox:当它存在时,你的实现把它放在哪里并不重要。它现在不存在。您假设访问无效内存总是会导致错误或分段错误,但这绝对不是真的。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。@SiKing:Q:“为什么在我删除指针后仍不能使用c_str?”a:“不是”。故事结束了。这显然既不是批评,也不是要求澄清。系统将此标记为潜在的低质量答案。我同意了。如果这确实是答案,那么听起来似乎应该将OP标记为关闭?
tt->pp: big
big