【发布时间】:2014-12-09 15:18:35
【问题描述】:
字符串指针pp是临时的,为什么删除指针后cout还是正确的?
#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;
}
输出是:
tt->pp: big
big
【问题讨论】:
-
未定义行为/线程。
-
上面提到的duplicate不是一个,因为它是关于访问局部变量的。这个问题是关于访问释放的内存。
-
@OlafDietsche:超出范围的局部变量有效地释放了内存。副本是正确的,如果您阅读它,您会理解为什么会这样。
-
@LightnessRacesinOrbit 一点也不,也许我应该为那些装傻的人提供更详细的信息。这里的错误是访问释放的 heap 内存。
-
@OlafDietsche:选择哪个物理位置来存储
std::string数据有什么关系?它超出了范围。 OP 在问为什么他仍然可以阅读它而不是出现分段错误或其他错误。是一样的。