氯的平方 2020-09-05 09:50 采纳率: 100%
浏览 154
已采纳

为什么只要我使用free函数在这个程序中 就会导致运行时错误呢?

刚刚开始学动态内存,很多地方不明白

图片说明
图片说明
图片说明
图片说明
图片说明图片说明
图片说明

DynamicArray* DynamicArray_new()
{
    DynamicArray* temp = (DynamicArray*)malloc(sizeof(DynamicArray));
    temp->capacity = 16;
    temp->size = 0;
    temp->data = (int*)malloc(sizeof(int) * 16);

    return temp;
}

void DynamicArray_insert(DynamicArray* This, size_t pos, const Elem* v)
{   
    if (This->size + 1 >= This->capacity)
    {
        int* temp = (int*)malloc(sizeof(int) * This->size); 

        for (int i = 0; i < This->size; i++)
        {
            temp[i] = This->data[i];
        }

        //free(This->data);
        This->data = (int*)malloc(sizeof(int) * This->capacity * 2); 

        This->capacity *= 2;

        for (int i = 0; i < This->size; i++)
        {
            This->data[i] = temp[i]; 
        }

    }


        int i = This->size - 1;
        int Pos = pos;

        while(i >= Pos)
        {
            This->data[i + 1] = This->data[i];
            i--;
        }

        This->size++;

        This->data[Pos] = *v;
}

Elem DynamicArray_erase(DynamicArray* This, size_t pos)
{
    This->size--;

    int Temp = This->data[pos];

    for (int i = pos; i < This->size; i++)
    {
        This->data[i] = This->data[i + 1];
    }


    if (This->capacity > 16 && This->size < ((This->capacity) / 4))
    {   
        int *temp = (int*)malloc(sizeof(int) * This->size);

        for(int i = 0;i < This->size;i++)
            temp[i] = This->data[i];


        //free(This->data);

        This->data = (int*)malloc(sizeof(int) * This->capacity / 4);

        for(int i = 0;i < This->size;i++)
        {
            This->data[i] = temp[i];
        }

        This->capacity /= 4;
    }

    return Temp;
}

Elem DynamicArray_get(const DynamicArray* This, size_t pos)
{
    return This->data[pos];
}

void DynamicArray_set(DynamicArray* This, size_t pos, const Elem* v)
{
    This->data[pos] = *v;
}

size_t DynamicArray_capacity(const DynamicArray* This)
{
    size_t T = This->capacity;
    return T;
}

size_t DynamicArray_size(const DynamicArray* This)
{
    size_t T = This->size;
    return T;
}

bool DynamicArray_empty(const DynamicArray* This)
{
    if (This->size == 0)
        return true;
    else
        return false;
}

void DynamicArray_resize(DynamicArray* This, size_t new_size)
{
    int Size = This->size;
    This->size = new_size;

    if(This->size >= This->capacity)
    {
        int *temp = (int*)malloc(sizeof(int) * This->size);

        for(int i = 0;i < This->size;i++)
        {
            temp[i] = This->data[i];
        }



        //free(This->data);
        This->data = (int*)malloc(sizeof(int) * This->capacity * 2);

        This->capacity *= 2;

        for(int i = 0;i < Size;i++)
        This->data[i] = temp[i];

        return ;
    }

    else if(This->size < This->capacity / 4 && This->capacity > 16)
    {
        int *temp = (int*)malloc(sizeof(int) * This->size);

        for(int i = 0;i < This->size;i++)
        {
            temp[i] = This->data[i];
        }

        //free(This->data);

        while(This->size < This->capacity && This->capacity > 16)
        This->capacity /= 2;

        This->data = (int*)malloc(sizeof(int) * This->capacity);

        for(int i = 0;i < Size;i++)
        This->data[i] = temp[i];

        return ;

    }

    int* a = (int*)malloc(sizeof(int) * This->size);

    for (int i = 0; i < This->size; i++)
    {
        a[i] = This->data[i];
    }

    //free(This->data);

    This->data = (int*)malloc(sizeof(int) * This->capacity);

    for(int i = 0;i < Size;i++)
    {
        This->data[i] = a[i];   
    }
}

void DynamicArray_delete(DynamicArray* This)
{
    This->size = 0;
    This->capacity = 0; 

    //free(This->data);
}
  • 写回答

1条回答 默认 最新

  • czc1014548352 2020-09-05 11:01
    关注

    你这个data是个数组,应该free;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月14日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭