【问题标题】:What is happening in the Curly Braces花括号中发生了什么
【发布时间】:2016-03-01 09:12:30
【问题描述】:

据我所知,} 实际上包含一些操作,例如销毁堆栈分配的对象,因为当对象的析构函数中发生一些错误时,VS.NET 将我指向花括号的关闭,甚至你可以使用F11 进入它并查看已调用的析构函数中发生了什么。但是,我注意到{ 也是一个操作,如果我尝试使用F11 进入它,VS.NET 告诉我它需要memset.asm 文件才能继续调试。

{ 内部到底发生了什么?

【问题讨论】:

  • 实际上花括号本身不是运算符,它们“包含”没有代码。是编译器添加代码,然后作用域开始和结束,但它与大括号并没有真正的关系(除了它们显示作用域的开始和结束位置)。当你走进例如析构函数,它是在您的代码之后但在范围实际结束之前插入的代码。光标结束在右大括号上是因为调试器没有任何其他位置信息。
  • 我明白了,谢谢。所以,我的问题应该是在我的代码在范围开始之前发生了什么

标签: c++ c++11 visual-studio-2013 curly-braces


【解决方案1】:

花括号确定范围和生命周期。在一对花括号中创建的对象在它们之外是不可访问的。它们不是代码;但是,由于对象可能会在您退出它们时被释放,编译器可能会生成代码作为右花括号的结果。

关于步入左大括号,实际上是步入大括号内的第一行可执行代码。那行代码可以解释为什么调试器会尝试进入 memset.asm。

【讨论】:

  • 谢谢,但试图进入 memset.asm 的这行代码不是我写的。正如@jachim 在他的评论中所说,这一行是由编译器产生的,我的问题是那里发生了什么。
  • 大括号内一定有东西。无论有什么,都必须调用 memset。请注意,在 C++ 中单步执行本机语言语句可能会导致这样的结果,因为您正试图单步执行编译器本身正在生成的代码。例如:如果您要声明一个数组,编译器可能会使用 memset 来清除内存。这是非常特定于编译器的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2013-10-14
  • 2019-01-26
相关资源
最近更新 更多