c++ - 当未初始化的内存传递给函数时如何断言/测试

标签 c++ c visual-studio-2008 memory-management

我发现我的部分代码有时会传递未初始化的内存。我正在寻找一种方法,在使用调试堆运行时发生这种情况时,我可以断言。这是一个可以在某些地方抛出的函数,以额外帮助跟踪错误:

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/

相关文章:

c++ - 在对内核代码进行字符串化后更改 openCL C++ 的主机端代码

c - VxWorks 上 strerror_r 消息的最大大小

java - 如何使用 JNI 将图像作为结构参数传递给 libfprint 的 C 函数

c - 如何使用信号函数调用其他函数?

c - 如何将 Visual Studio 2008 Express Edition 配置为 c89/c90/c99?

c++ - CWinApp::OpenDocumentFile 创建一个新窗口

c++ - Eclipse C++ 包括来 self 的源文件夹的头文件

C++ constexpr 与字符串文字中的宏与整数

c++ - 避免 DLL 版本控制问题

visual-studio - 有没有办法最大化 Visual Studio 中的当前选项卡?