它必须是一个已被问过的问题,但我无法在任何地方找到任何答案......
我的问题很简单:我读到使用关键字创建变量时new,其范围不受周围环境的限制{..}.那么为什么这段代码不能编译?
{
std::string * s = new std::string("foo");
}
std::cout << "print : " << (*s) << std::endl;
Run Code Online (Sandbox Code Playgroud)
Visual Sudio告诉我:"标识符"是"未定义的"所以范围仍然受限于关键字"新"?
您会混淆两个独立的概念:名称的范围和对象的生命周期.您还混淆了两个独立的对象:指针变量s,以及std::string它指向的类型对象.
new std::string创建一个具有动态生命周期的对象,持续到删除它为止.只要您有指针或引用它,就可以从任何地方访问它.它没有名称,因此不涉及范围.
std::string * s声明具有块范围和自动生命周期的变量.该名称只能在该范围内访问,并且当程序离开该范围时,该变量(指针,而不是它可能指向的任何对象)将被销毁.