c/c++:在 Visual Studio 中自动初始化指向 null 的指针

Posted

技术标签:

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

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

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

【问题讨论】:

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

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

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

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

改为:

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

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

When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?

【讨论】:

请注意,这些值仅出现在调试版本中(除非有奇怪的构建配置) @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;
;

【讨论】:

以上是关于c/c++:在 Visual Studio 中自动初始化指向 null 的指针的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2019 中的自动递增 FileVersion (build nr)

如何在 Visual Studio 中自动将预处理器和注释块插入到新的 C++ 头文件中?

是否可以自定义 Visual Studio 自动格式化?

visual studio C/C++ 编程学习 visual studio 中的生成事件

Visual studio 2019中如何将C/C++程序生成为.exe文件或者是文件夹(文件夹里面有主程序以及其他部分)?

哪些C语言函数在visual studio2015报错并怎么修改