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