用 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/