【问题标题】:c/c++: Automatically initialize pointers to null in visual studioc/c++:在 Visual Studio 中自动初始化指向 null 的指针
【发布时间】:2015-10-05 10:29:27
【问题描述】:

我了解自动将未初始化的指针初始化为 null 会产生开销。但是我已经准备好承受这种开销了; 那么如何让 Visual Studio 2010 C++ 编译器将所有未初始化的指针设置为 null。

请注意,我在调试现有应用程序时不需要智能指针解决方案。

【问题讨论】:

  • 什么是“c/c++”?选择一种语言进行询问。
  • 如果尝试使用未初始化变量的值,您可以让 VS2010(以及其他一些编译器)发出警告。从长远来看,您最好启用此类警告并编写代码以消除此类警告,而不是尝试打开会导致问题的非标准行为。
  • @LightnessRacesinOrbit:公平地说,“C/C++”长期以来一直是对 MSVC 的公平描述。它既不是 C 也不是 C++,缺少所有 C99 和不少 C++98。

标签: c++ c visual-studio c++11


【解决方案1】:

我不知道有任何此类功能,而且我以前从未听说有人在寻找它。

这似乎是一条非常危险的道路。

当您编写代码只是假设未初始化的指针是空指针,然后将代码迁移到新安装的 IDE 或将其提供给其他人时会发生什么?您将传播难以发现的 UB 错误。不好!

改为:

  • 为未初始化的变量打开警告
  • 初始化这些变量

或者,为了调试现有的损坏代码,使用 Visual Studio 为具有自动存储持续时间的未初始化数据提供基础字节模式 0xCC 的事实。寻找这个值,而不是0x00

【讨论】:

  • 请注意,这些值仅出现在调试版本中(除非有奇怪的构建配置)
  • @Yakk: “用于调试现有的损坏代码” 旨在暗示这一点;还有更多信息的链接。但也许我应该更清楚。
【解决方案2】:

使用智能指针。 std::unique_ptr、std::shared_ptr、std::weak_ptr。忘记未初始化的空指针。

【讨论】:

    【解决方案3】:

    您可以创建一个具有这种行为的类,例如:

    template <typename T>
    class Ptr
    {
    public:
        Ptr() = default;
        Ptr(T*ptr) : ptr(ptr) {}
        // ...
        operator T*&() {return ptr;}
    private:
        T* ptr = nullptr;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多