我有这些结构:
typedef struct tStimulus_tc
{
short Key;
struct tStimulus_tc *Next;
}Stimulus_tc;
struct Frame_tc
{
int ID; // Frame ID (0..MAX)
int Count; // Felt Count
short sSize; // Stimulus List Size
Stimulus_tc *sList; // Stimulus List
};
如果我想释放“struct Frame_tc”就够了吗?
void freeFrame (Frame_tc *fTemp)
{
free(fTemp);
}
或者我需要通过它的刺激并逐一释放? 什么是释放变量的正确方法?
答案 0 :(得分:2)
free()
获取先前分配的块并将其释放以供重用。它不知道也不关心缓冲区的内容。
虽然您可以编写一个递归释放指针的编译器,但这不是一个好主意:
static Stimulus_tc stim;
Frame_tc *fTemp = malloc(sizeof *fTemp);
fTemp->sList = &stim;
fTemp->sSize = 1;
free(fTemp); // if this recursively freed pointers, we would free a static object
只有你知道你的结构是如何构建的,因此你应该是破坏它的人。在您的情况下,这意味着走链接列表并释放每个成员。
在C ++中,建议使用更高级别的机制,例如使用std::vector<Stimulus_tc>
或std::list<Stimulus_tc>
。
如果指针使用不可避免(您的情况不是一个),请考虑使用smart pointers。如果你绝对必须以旧方式管理记忆,use type-safe new[]
/delete[]
。
答案 1 :(得分:2)
在C中,如果Stimulus_tc
包装器中的struct Frame_tc
列表不是传统的头/尾列表(例如,使用最终的->Next = NULL
),但是包含的节点数量是list->sSize
,你可以做类似以下的事情:
/* free all nodes in struct Frame_tc->Stimulus_tc list */
void free_list (struct Frame_tc *list)
{
Stimulus_tc *iter = list->sList; /* pointer to iterate list */
Stimulus_tc *victim = NULL; /* pointer to node to delete */
int n = list->sSize; /* number of nodes to delete */
if (iter == NULL) {
fprintf (stderr,"print_list() warning: empty list.\n");
return;
}
while (n--) { /* free n nodes */
victim = iter;
iter = iter->Next;
free (victim);
}
}
如果您将最终Next
指针设置为NULL
,则可以取消int n = list->sSize;
并使用while (iter) { ...
如果在每个节点中分配了额外的指针元素,那么在free
之前只需free (victim);
这些值
仔细看看,如果您有任何问题,请告诉我。