用0xDD或0xCC或0xFD或0xCD检查指针是否合适?

Sat*_*ngh 0 c c++ pointers unity-game-engine

用0xDD或0xCC或0xFD检查指针是好的,还是0xCD如果它不是NULL?我正在为Unity3D编写插件,它支持C和C++的一些功能.所以这里不允许新的.

char** m_strArry;

void FreeChar(char* a_data)
{
    free(a_data);
    a_data = NULL;
}

void Test_PointerReference2()
{
    m_strArry = (char**)malloc(3);

    char* l_str1 = (char*)malloc(5);
    strcpy_s(l_str1, 5, "Test");

    char* l_str2 = (char*)malloc(7);
    strcpy_s(l_str2, 7, "String");

    char* l_str3 = (char*)malloc(5);
    strcpy_s(l_str3, 5, "Here");

    m_strArry[0] = l_str1;
    m_strArry[1] = l_str2;
    m_strArry[2] = l_str3;

    FreeChar(l_str2);

    for (int l_index = 0; l_index < 3; l_index++)
    {
        char* l_data = m_strArry[l_index];    //ISSUE: FOR l_index=1(OR l_str2) l_data is a valid address with garbage data.
        if(l_data == NULL)
            printf_s("\nIndex %d is NULL", l_index);
        else
            printf_s("\nIndex %d = '%s'", l_index, l_data);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我通过向FreeChar()发送指针引用来修复上述问题.即

void FreeChar(char*& a_data)
{
    free(a_data);
    a_data = NULL;
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我得到m_strArry [1]或l_str2的指针值为NULL.

但在我的一些情况下,我得到poitner值为0xDD(即,填充的内存位置是释放的堆内存).我在这个链接上读到0xDD,0xCC,0xFD和0xCD是保留地址.

那么,除了检查NULL之外,检查带有0xDD或0xCC或0xFD或0xCD的指针是好的(还是好的做法)?如果我不检查任何原因,那么这个问题的解决方案是什么?

Vil*_*lx- 7

不,这根本不是一个好习惯.这些价值观无证,非正式且不可靠.他们将来可能会改变.在发布版本中,它们可能根本不会显示.

如果你遇到这样的问题,那就意味着你有一个bug.在这种情况下,它在这里:

m_strArry = (char**)malloc(3);
Run Code Online (Sandbox Code Playgroud)

3个字节太少,无法容纳3个指针.你需要:

m_strArry = (char**)malloc(3 * sizeof(char*));
Run Code Online (Sandbox Code Playgroud)

正如评论中所指出的,这只是问题的一半.另一半是一个事实,FreeChar(l_str2);不重置m_strArry[1]到null.

是的,这是合法的.C/C++不会跟踪复制的位置.作为开发人员,您有责任确保在释放内存后,所有指向内存块的指针都已正确处理掉.没有这样做被称为"悬空指针",这在C/C++中是一个非常常见的错误.这可能会对您的程序造成各种各样的破坏,从崩溃到损坏的数据.事实上,它可能是导致程序崩溃的最普遍原因之一.