有时您会遇到仅在发布版本中和/或仅在某些机器上可重现的错误。一个常见的(但绝不是唯一的)原因是未初始化的变量,它们受到随机行为的影响。例如,在大多数机器上,未初始化的 BOOL 大部分时间可能为 TRUE,但随机初始化为 FALSE。
我希望我有一种通过修改 CRT 内存初始化的行为来清除此类错误的系统方法。我很清楚 MS 调试 CRT幻数- 至少我希望有一个触发器将 0xCDCDCDCD(初始化新分配的内存的模式)设置为零。我怀疑即使在调试版本中,也可以通过这种方式轻松消除讨厌的初始化害虫。
我是否缺少启用此功能的可用 CRT 挂钩(API、注册表项等)?有人有其他想法可以到达那里吗?
[编辑:]似乎需要澄清。
- 通常的幻数确实有很多优点,但它们不提供布尔初始化(始终为真)或针对单个位掩码测试的位字段或类似情况的覆盖范围。一致的零初始化(当然,我可以打开和关闭),将添加一层测试,可以显示不良的初始化行为,否则可能很少见。
- 我当然知道CrtSetAllocHook。这样设置的钩子不会接收到分配缓冲区的指针(在分配缓冲区之前调用它),所以它不能覆盖它。重载全局 new 也没有多大好处,因为它会覆盖任何有效的构造函数初始化。
[编辑:] @Michael,不确定覆盖 new 是什么意思。简单的代码,如 -
void* new(...)
{
void* res = ::new(...); // constructors now called!
if(SomeExternalConditionApplies())
OverWriteBufferWithMyPetValues(res);
}
行不通。粘贴和修改整个 ::new 代码可能会起作用,但看起来有点吓人(上帝只知道我必须#include 和链接才能让它运行)。