我有一个嵌套的数据结构(这些是初始化):
-> [Signal 0] -> [Interval 0][Interval 1][Interval 2]...
[Stack] -> [Signal 1] -> [Interval 0][Interval 1]
-> [Signal 2] -> [Interval 0][Interval 1][Interval 2]...
数据的结构如何:多个Interval结构指针存储在每个Signal结构的'interval'数组中。每个Signal结构指针都存储在Stack结构的'signals'数组中(总是只有一个)。
void pop(Signal *s, int n){
if(n < s->top) {
printf("[%d,%d)@%d ", s->intervals[n].b, s->intervals[n].e, s->intervals[n].m);
pop(s,n+1);
}
else {
free(s->intervals);
}
}
void printIntervals(Stack *st){
for(int i=0; i<st->top; i++){
pop(&(st->signals[i]), 0);
printf("\n");
free(&(st->signals[i]));
}
}
我如何尝试访问和释放数据:我有两个函数可以从结构中打印出数据,并尝试释放使用malloc(和realloc)分配的内存。但是我似乎得到了一个SIGABRT(错误134)。我想这是因为我如何释放记忆;但我不知道该怎么做!
private void OnChangedPixelWValue(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (JustHModified)
{
return;
}
if (VM.IsKeepAspectRatio)
{
double DesiredHeight = VM.ImageSizeX / RatioWH;
JustHModified = true;
VM.ImageSizeY = (int)DesiredHeight;
JustHModified = false;
}
}
// ... Same logic exists (OnChangedPixelHValue)
1。一次调用printIntervals,然后调用每个信号的pop函数。
2. pop函数以递归方式打印出每个间隔结构,直到包含间隔的数组为空,此时我 试图从信号中释放区间数组。
3。此时弹出结束,流程返回到printIntervals。在这里,我尝试释放信号数组 没有什么可以打印,循环继续打印下一个信号 来自Stack。
我释放内存的方式不正确吗?如何修复内存错误?谢谢。
答案 0 :(得分:4)
如果您free()
多个Stack
指针 - 将其作为一个考试 - 您实际上总是释放相同的指针。
当您在函数范围内将结构声明为static
时,它仅初始化一次,后续调用将影响您最初返回的指针,从而在一个成员上有效地使用malloc()
所有指针都指向同一个malloc()
ed区域。所以它指向的前一个指针现在已丢失,你无法释放它。
此外,您无法free()
malloc()
未归还的内容。特别是在指针上调用free()
是可疑的,并且可能是错误的,这实际上是评估运算符的&
地址的结果。
您的代码应该修复如下,
Interval *
newInterval(int b, int e, int m)
{
Interval *interval;
interval = malloc(sizeof(*interval));
if (interval == NULL)
return NULL;
interval->b = b;
interval->e = e;
interval->m = m;
return interval;
}
Signal *
newSignal(int size)
{
Signal *signal;
signal = malloc(sizeof(*signal));
if (signal == NULL)
return NULL;
signal->intervals = malloc(size * sizeof(*signal->intervals));
if (signal->intervals == NULL) {
free(signal);
return NULL;
}
signal->top = 0;
signal->size = size;
return signal;
}
Stack *
newStack(int size)
{
Stack *stack;
stack = malloc(sizeof(*stack));
if (stack == NULL)
return NULL;
stack->signals = malloc(size * sizeof(*stack->signals));
if (stack->signals == NULL) {
free(stack);
return NULL;
}
stack->top = 0;
stack->size = size;
return stack;
}
此外,良好的设计很重要,一个名为print*
的函数根本不会释放任何东西,实际上你应该避免在给定的上下文中释放内存。