c++ - 用 0xDD 或 0xCC 或 0xFD 或 0xCD 检查指针好吗?

标签 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。

但在我的某些情况下,我得到的指针值为 0xDD(即填充的内存位置是已释放的堆内存)。我在 this 上阅读链接那个 0xDD、0xCC、0xFD 和 0xCD 是保留地址。

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

最佳答案

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

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

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

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

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

如评论中所述,这只是问题的一半。另一半是 FreeChar(l_str2); 不会将 m_strArry[1] 重置为 null

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

关于c++ - 用 0xDD 或 0xCC 或 0xFD 或 0xCD 检查指针好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259110/

相关文章:

c++ - inotify 的非阻塞选择

c++ - 如何将 stderr 和 stdout 组合成单个 C++ 字符串?

c - C 中的二项式系数递归函数带来错误的结果,为什么?

c - 重新计算 TCP 校验和

c - 释放被覆盖的指针

c++ - if 语句中的变量范围

c++ - 模板初始化构造函数错误

无法使用自己的加密功能对文本进行两次加密

c - 遍历数组并将元素移动到数组末尾

c - 通过指针的字符串(数组)容量