C - 如何在另一个struct中正确释放struct

时间:2017-01-07 12:44:36

标签: c struct free

我在释放结构时遇到问题,我必须创建一个动态数组,读取数组的数量以供进一步使用并释放分配的内存。

typedef struct
{
  tContacto  contacto;  
  int        n_tiendas; 
  tTienda    *p_tiendas;   
}tCadena;

main()
{
   tCadena cadena;

   if (CrearTiendas(&cadena)==-1)
   //More code, no problem here

LiberaMemoria(cadena); //Function for freeing memory
return 0;
}

int CrearTiendas(tCadena *p_cadena)
{
    int numero;
    printf("Introduce el numero de tiendas:\t"); //Asking for number
    scanf("%d",&numero);
    if((p_cadena=(tCadena *)malloc(numero*sizeof(tCadena)))!=NULL)
    {
        return 0;   
    }
    else 
    {
        return -1;
    }

}

void LiberaMemoria(tCadena cadena)
{
    free(cadena); //Obviously this isn't correct, it's not a pointer
}

因此,我自己编写的唯一内容是LiberaMemoria()函数。 如何正确释放p_cadena上分配的内存?

谢谢。

2 个答案:

答案 0 :(得分:0)

您的程序导致内存泄漏:您的程序正在分配一些内存并将其丢弃。

p_cadena函数中更改为本地参数CrearTiendas()会影响main()中的局部变量。

应该对代码做些什么是停止导致内存泄漏:不要仅仅因为导致内存泄漏而进行分析。

int CrearTiendas(tCadena *p_cadena)
{
    int numero;
    printf("Introduce el numero de tiendas:\t"); //Asking for number
    scanf("%d",&numero);
    return 0;
}

不幸的是,您说您只能编辑LiberaMemoria()。然后,不要做任何事情来释放泄漏的内存并让操作系统释放内存。

void LiberaMemoria(tCadena cadena)
{
}

参考:c - What REALLY happens when you don't free after malloc? - Stack Overflow

答案 1 :(得分:0)

问题在于内存分配,正确的形式是:

p_cadena->p_tiendas=(tTienda *)malloc(numero*sizeof(tTienda)

和自由功能:

void LiberaMemoria(tCadena cadena)
{
    free(cadena.p_tiendas);
}