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

时间:2018-01-15 08:16:04

标签: c++ c pointers unity3d

用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);
    }
}

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

不,这根本不是一个好习惯。这些值undocumented非官方且不可靠。他们将来可能会改变。在发布版本中,它们可能根本不显示。

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

m_strArry = (char**)malloc(3);

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

m_strArry = (char**)malloc(3 * sizeof(char*));

正如评论中所指出的,这只是问题的一半。另一半是FreeChar(l_str2);没有将m_strArry[1]重置为null的事实。

是的,这是合法的。 C / C ++没有跟踪复制的位置。作为开发人员,您有责任确保在释放内存后正确处理内存块的所有指针。没有这样做被称为&#34;悬空指针&#34;并且它是在C / C ++中犯下的非常常见错误。这可能会对您的程序造成各种各样的破坏,从崩溃到损坏的数据。事实上,它可能是导致程序崩溃的最广泛原因之一。