use*_*410 3 c pointers double-free dangling-pointer
经历了一些痛苦的经历后,我理解了悬挂指针和双重自由的问题.我正在寻求适当的解决方案
aStruct 有许多字段,包括其他数组.
aStruct *A = NULL, *B = NULL;
A = (aStruct*) calloc(1, sizeof(sStruct));
B = A;
free_aStruct(A);
...
// Bunch of other code in various places.
...
free_aStruct(B);
Run Code Online (Sandbox Code Playgroud)
有没有办法写出free_aStruct(X)这样才能free_aStruct(B)优雅地退出?
void free_aStruct(aStruct *X) {
if (X ! = NULL) {
if (X->a != NULL) { free(X->a); x->a = NULL; }
free(X); X = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
上述操作仅A = NULL在free_aStruct(A);调用时设置.B现在正在晃来晃去.
如何避免/纠正这种情况?引用计数是唯一可行的解决方案吗?或者,是否有其他"防御性"方法来释放记忆,防止free_aStruct(B);爆炸?
在简单的C中,这个问题最重要的解决方案是纪律,因为问题的根源在于:
B = A;
Run Code Online (Sandbox Code Playgroud)
制作指针的副本而不更改结构中的任何内容,绕过您使用的任何内容,而无需编译器发出任何警告.你必须使用这样的东西:
B = getref_aStruct(A);
Run Code Online (Sandbox Code Playgroud)
下一个重要的事情是跟踪分配.有些事情有助于清洁模块化,信息隐藏和干燥 - 不要重复自己.在使用free_aStruct()函数释放它时,直接调用calloc()来分配内存.最好使用create_aStruct()来分配它.这样可以将事物集中在一个地方,而不是在整个代码库中投入内存分配.
对于您构建的内存跟踪系统,这是一个更好的基础.