使用gcc/g++/gdb/valgrind进行调试时的幻数



Microsoft的Visual C++如果没有由程序员自己初始化,就会用"幻数"填充内存。这有助于调试未初始化的内存。(在Visual Studio C++中,内存分配表示法是什么?0xDEADBEEF与NULL)

使用linux GNU工具(g++/gdb)时是否有类似的功能?

谢谢!

您可以覆盖C++operator new来设置对首选字节模式的分配:

void* operator new(size_t size)
{
    void* mem = malloc(size);
    if (!mem) {
        throw std::bad_alloc();
    }
    memset(mem, 0xEE, size);
    return mem;
}

您可以在此处看到GCC的完整实施:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/new_op.cc,以防您想更紧密地镜像它。

这将适用于任何使用默认C++分配器的东西,但不适用于使用常规旧malloc()的东西。如果您需要直接从malloc()初始化内存,您也可以重写它,但执行此操作的机制不同:您可以使用链接器的--wrap选项来操作符号表,并允许您重写malloc()。那么您当然不需要使operator new过载。这里的答案说明了完整的方法:https://stackoverflow.com/a/3662951/4323