【问题标题】:Why is it necessary to do a rebuild after adding a new member variable to a class?为什么在向类添加新成员变量后需要进行重建?
【发布时间】:2011-07-20 20:22:59
【问题描述】:

今天早上,在 Visual Studio 2005 中,我尝试向一个类添加一个新的 private 成员变量,发现它给了我各种奇怪的分段错误等。当我进入调试模式时,我发现我的调试器甚至没有看到新的成员变量,因此它给了我一些奇怪的行为。

为了让我的程序再次运行(并让调试器看到我创建的新成员变量),它需要“全部重建”。 为什么需要全部重建?为什么只进行常规构建是不够的?

我已经解决了这个问题,但我觉得我更好地了解构建过程将对我未来有所帮助。如果您需要更多信息,请告诉我。

提前致谢!

【问题讨论】:

  • public 还是private 变量?
  • 它是private(刚刚修改了我的问题以反映这一点)。

标签: c++ visual-studio-2005 build-process rebuild


【解决方案1】:

当您添加或删除一个类的成员时,您会更改对象的内存布局。如果您不重新编译,您将违反 ODR 规则,而分段错误正是由此产生的影响。

至于为什么会发生这种情况,旧代码可能正在为旧大小获取内存,然后将该对象(没有新成员)传递给新代码,新代码将在分配的内存结束后访问以访问新变量。请注意,访问说明符根本不会影响,如果它是私有的,则可能是访问字段的类成员函数。

如果您没有将字段添加到对象的末尾,而是添加到对象的中间,则在访问编译器在较高内存地址中布局的那些字段时会看到相同的效果。

您需要使用 rebuild all 功能这一事实表明您的项目的依赖项配置不正确,您应该尽快修复它。拥有正确的依赖关系将迫使编译器在需要时重新构建,这将意味着更少的无用调试时间。

【讨论】:

  • 如果您添加或删除一个类的成员,并且该类是在头文件中定义的,则构建系统应该使用该头文件自动重新编译所有文件。前提是构建系统正常工作(VS 没有,但我怀疑他是否处于其中一种失败的情况)并且您正确使用它。
【解决方案2】:

一个明显的答案是:“因为 Visual Studios 已损坏,并且无法正确处理依赖项”。然而,事实上,我认为您没有为我们提供足够的信息让我能够做出这样的陈述(Visual Studios 确实正确处理了简单的案例)。

当你添加成员(privatepublic,没关系),尤其是数据成员,还有虚函数时,你改变了类在内存中的物理布局。所有依赖于该物理布局的代码都必须重新编译。通常,构建系统会自动处理此问题,但损坏的 makefile 或系统中的错误很容易意味着它没有。 (正确的答案不是调用重建/make clean,而是修复构建系统的问题。)

【讨论】:

  • +1 我倾向于认为这更多的是配置错误而不是 VS 错误。但我不知道,我不使用 VS :)
  • @David 我也很怀疑。我知道 VS 在管理依赖项方面确实存在问题,但仅限于特殊情况。对于日常的简单应用程序,它可以正确完成工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多