用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的指针是否良好(或良好做法)?如果我不检查任何原因,那么这个问题的解决方案是什么?
答案 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 ++中犯下的非常常见错误。这可能会对您的程序造成各种各样的破坏,从崩溃到损坏的数据。事实上,它可能是导致程序崩溃的最广泛原因之一。