引用“的C++编程语言”(特别版,部分4.9.6,“对象和左值”),并且如众所周知的:关于范围和寿命
[...]的对象声明在函数被创建时,当其名称超出范围时会被创建并销毁
行!并在第4.9.4节中提到:
名称只能用于程序文本的特定部分。对于在函数中声明的名称,该范围从声明点延伸到声明发生的块的末尾。
这一切听起来不错!
但我的问题是:如果一个(自动)变量在控制到达块的末尾时如何被销毁?还有一个子问题:实际上是这样吗?
例如:
int main()
{
int* c = 0;
{
int b = 999;
c = &b;
} // End of the scope of b...
std::cout << b; // ... so this is illegal
// But ...
std::cout << *c; // ... is OK, so 'b' has not really been destroyed
}
据我所知,其辞职的,因为涉及的函数调用堆栈相关的东西函数的范围时,局部变量被销毁。但是当退出一个简单的{ // ... }
块时,没有任何反应。
那么它是一种特定语言会导致未定义的行为(在我的情况下,最后的cout
实际上是未定义的),但实际上在执行时没有效果(没有实际执行任何操作来销毁对象)?
谢谢!
编辑1:我不考虑静态变量。
编辑2:如果变量是具有析构函数的对象对我来说很清楚,那么我就会询问非对象变量。
查看代码所做的一个更好的方法是将“b”作为其类的析构函数的对象。 – Pointy 2010-08-30 13:24:05
这是一个很好的例子,说明为什么使用编译器告诉你什么是和不正确的C++是一个坏主意。 – 2010-08-30 14:04:19
这实际上恰恰相反,因为我正在阅读TC++ PL以获得正确的定义,我正在尝试使用示例并在此处询问...... – 2010-08-30 14:11:50