今天早上,在 Visual Studio 2005 中,我尝试向private
一个类添加一个新成员变量,发现它给了我各种奇怪的分段错误等。当我进入调试模式时,我发现我的调试器甚至没有看到新的成员变量,因此它给了我一些奇怪的行为。
它需要“全部重建”以使我的程序再次运行(并让调试器查看我创建的新成员变量)。 为什么有必要重建一切?为什么仅仅进行常规构建是不够的?
我已经解决了这个问题,但我觉得我更好地理解构建过程将在未来帮助我。如果您需要更多信息,请告诉我。
提前致谢!
今天早上,在 Visual Studio 2005 中,我尝试向private
一个类添加一个新成员变量,发现它给了我各种奇怪的分段错误等。当我进入调试模式时,我发现我的调试器甚至没有看到新的成员变量,因此它给了我一些奇怪的行为。
它需要“全部重建”以使我的程序再次运行(并让调试器查看我创建的新成员变量)。 为什么有必要重建一切?为什么仅仅进行常规构建是不够的?
我已经解决了这个问题,但我觉得我更好地理解构建过程将在未来帮助我。如果您需要更多信息,请告诉我。
提前致谢!
当您添加或删除一个类的成员时,您会更改对象的内存布局。如果您不重新编译,您将违反 ODR 规则,而分段错误只是其结果。
至于为什么会发生这种情况,旧代码可能正在为旧大小获取内存,然后将该对象(没有新成员)传递给新代码,新代码将在分配的内存结束后访问以访问新变量。请注意,访问说明符根本不影响,如果它是私有的,则可能是访问字段的类成员函数。
如果您没有将字段添加到对象的末尾,而是添加到对象的中间,则在访问编译器在较高内存地址中布局的那些字段时会看到相同的效果。
您需要使用全部重建功能这一事实表明您的项目的依赖关系配置不正确,您应该尽快修复它。拥有正确的依赖关系将迫使编译器在需要时重新构建,这意味着更少的无用调试时间。
一个明显的答案是:“因为 Visual Studios 已损坏,并且无法正确处理依赖关系”。然而,事实上,我认为你没有给我们足够的信息让我能够做出这样的陈述(Visual Studios 确实得到了正确的简单案例)。
当你添加成员(private
或者public
,没关系),尤其是数据成员,还有虚函数时,你改变了类在内存中的物理布局。所有依赖于该物理布局的代码都必须重新编译。通常,构建系统会自动处理此问题,但损坏的 makefile 或系统中的错误很容易意味着它没有。(正确的答案不是调用重建/清理,而是解决构建系统的问题。)