C编程:SIGABRT 134错误;我正确地释放了这个记忆吗?

时间:2018-02-14 16:31:35

标签: c pointers memory struct free

我有一个嵌套的数据结构(这些是初始化):

        -> [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。

我释放内存的方式不正确吗?如何修复内存错误?谢谢。

1 个答案:

答案 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*的函数根本不会释放任何东西,实际上你应该避免在给定的上下文中释放内存。