我发现我的部分代码有时会传递未初始化的内存。我正在寻找一种方法,在使用调试堆运行时发生这种情况时,我可以断言。这是一个可以在某些地方抛出的函数,以额外帮助跟踪错误:
void foo( char* data, int dataBytes )
{
assert( !hasUninitialisedData(data,dataBytes) ); //, This is what we would like
...
}
我看到有像 valgrind 这样的工具,当我在 Windows 上运行时,有 DrMemory。然而,这些在应用程序外部运行,因此当问题发生时开发人员不会发现问题。更重要的是,它们会为 Qt 和其他不相关的函数抛出数千份报告,使事情变得不可能。
我认为这个想法是有一个函数可以在数组中搜索 0xBAADFOOD,但是有一系列潜在的十六进制值,并且这些值因平台而异。当存储整数时,这些十六进制值有时也可能有效,因此不确定是否可以从调试堆中获得更多信息。
我主要感兴趣的是可能存在 CRT 函数、库、visual-studio 断点或其他辅助函数来执行此类检查。它“感觉”好像应该已经有一个地方了,我还找不到它,所以如果有人对这种情况有一些好的解决方案,我们将不胜感激。
编辑:我应该更好地解释一下,我知道调试堆将使用一个值初始化所有分配,以尝试允许检测未初始化的数据。如前所述,接收到的数据包含一些 0xBAADFOOD 值,通常内存是用 0xCDCDCDCD 初始化的,但这是分配数据的第三方库,显然有多个魔数(Magic Number),因此我很感兴趣是否有隐藏在某处的通用检查。
最佳答案
VC++ 运行时,至少在调试版本中,使用特定值初始化所有堆分配。从我记事起,它就一直是相同的值。但是,我不记得实际值。您可以进行快速分配测试和检查。
关于c++ - 当未初始化的内存传递给函数时如何断言/测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976376/