【问题标题】:Visual Studio: Disable Automatic InitializationVisual Studio:禁用自动初始化
【发布时间】:2016-05-29 12:43:15
【问题描述】:

我在 Visual Studio Enterprise 中编写 C++ 作业代码。但是,我注意到当我在 linux 中运行我的代码以检查不同的平台时,我会遇到错误,因为无论你对变量做什么,Visual Studio 都会将所有变量初始化为零。例如,我忘记将链接列表练习中的头指针设置为 nullptr,VS 仍然运行良好,但 linux 没有。我真的很想早点发现这些错误,那么有没有办法在VS中禁用这种自动初始化?

谢谢

【问题讨论】:

  • VS 仅在调试版本中执行此操作。测试您的发布版本。
  • 我记得问题恰恰相反,g++ 打算通过将局部变量归零来提供“熊的帮助”。无论如何,解决方案是采用更严格的编程实践。
  • @Y。 Lou 通常,当使用具有自动存储持续时间的未初始化变量时,编译器会发出警告。查看是否可以更改 MS VC++ 的警告级别。
  • 尝试在发布模式下编译。还可以考虑将 Linux 作为您的主要构建平台。通过 valgrind 运行您的程序以捕获大量错误。使用 -Wall -Wextra -Werror 进行编译,基本就搞定了。
  • @Cheersandhth.-Alf 不需要放弃任何东西。在 Visual Studio 中编辑代码是可以的,这没什么问题。

标签: c++ visual-studio visual-studio-2010 visual-studio-2012 visual-c++


【解决方案1】:

https://msdn.microsoft.com/en-us/library/jj161081.aspx

您是否尝试过禁用 SDL?

右键单击您的项目 => 属性 => C/C++ => 代码生成 => 安全检查 => 禁用安全检查。

【讨论】:

  • 非常感谢!这有助于捕获我的 nullptr 错误!
【解决方案2】:

就根本问题而言,调用malloc 是导致不一致的原因(注意operator new 在内部使用malloc)。在malloc 的文档中,它明确声明内存未初始化。但是,操作系统/运行时可能会自动干预和初始化内存,就像 VS 调试运行时一样,但这不应该在跨平台开发中依赖。

要获得一致的行为,您可以改为使用calloc 分配内存(并覆盖operator new 以使用calloc 而不是malloc)。当然,这意味着您将在程序中使用一些循环来初始化内存。或者,您可以使用“垃圾”填充从 malloc 分配的内存,这也是查找内存初始化问题的常用策略。

在不替换分配器的情况下检测它,在 Visual Studio 中,确保将“基本运行时检查”设置为“两者 /RTC1”或“未初始化变量 /RTCu”。在某些情况下,当成员在未初始化的情况下使用时,这应该会让您在调试器中中断,尽管这不能保证。请参阅here,了解更多关于发生这种检测的情况的信息。

【讨论】:

    【解决方案3】:

    您可以使用 Visual Studio 设置解决一些问题。

    转到ProjectProperties -> C/C++ -> General -> Treat Warning as Error 并将其设置为True

    我可能无法完全解决您的问题,但会帮助您提前发现一些错误。

    希望这会有所帮助。

    【讨论】:

    • 也将警告级别提高到/W4
    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多