C 如何从内存和内存中的数组中释放结构

C 如何从内存和内存中的数组中释放结构,c,memory-management,struct,C,Memory Management,Struct,我想知道如何从内存中正确释放结构并完全擦除它。我还需要擦除此结构中的数组或值。每次数据更改时,我都尝试用新数据覆盖结构,但我发现内存使用量稳步上升,直到收到内存警告,所以我认为最安全的方法是先完全擦除数据,然后再写入 typedef struct { SInt16 *array1; SInt16 *array2; } myStruct, *myStructPtr; myStructArray mySt

我想知道如何从内存中正确释放结构并完全擦除它。我还需要擦除此结构中的数组或值。每次数据更改时,我都尝试用新数据覆盖结构,但我发现内存使用量稳步上升,直到收到内存警告,所以我认为最安全的方法是先完全擦除数据,然后再写入

    typedef struct {


        SInt16  *array1;     
        SInt16  *array2;    

    } myStruct, *myStructPtr;


 myStructArray        myStruct[16];

    for(int i=0;i<16;i++)

    {
        myStruct[i].array1 =
        (AudioUnitSampleType *) calloc (asize, sizeof (SInt16));

        myStruct[i].array2 =
        (AudioUnitSampleType *) calloc (asize, sizeof (SInt16));

    }

   free(myStructArray) // throws SIGBART error
typedef结构{
SInt16*阵列1;
SInt16*阵列2;
}myStruct,*myStructPtr;
myStructArray myStruct[16];

对于(int i=0;i您没有
malloc
calloc
myStructArray
所以您不应该
释放它。循环元素并
释放
myStruct[i]。数组1
数组2

for(int i=0;i<16;i++)
    {
        free(myStruct[i].array1);
        free(myStruct[i].array2);
    }

for(inti=0;i您没有
malloc
calloc
myStructArray
所以您不应该
释放它。循环元素并
释放
myStruct[i]。数组1
数组2

for(int i=0;i<16;i++)
    {
        free(myStruct[i].array1);
        free(myStruct[i].array2);
    }
for(int i=0;i
myStruct
是在堆栈上创建的一个对象数组。您不能对其调用
free
free
需要对从免费存储中获取的资源进行调用(使用malloc、realloc等)。相反,您需要对结构成员
array1
array2


myStruct
是在堆栈上创建的一个对象数组。您不能对其调用
free
free
需要对从免费存储获取的资源进行调用(使用malloc、realloc等)。相反,您需要对结构成员
array1
array2

建议:myStruct[i]。array1=calloc(asize,sizeof*myStruct[i].array1)。没有cast和sizeof对象,而不是sizeof(type)。你说的“擦除”是什么意思?为什么你认为需要这样做?William建议的原因是1)强制转换抑制可能指示运行时错误的编译时警告;应该尽可能避免它们2)重复该类型容易出错——如果数组的类型已更改,但calloc参数未更改,则您将分配错误的数量,这可能导致难以找到的崩溃。这违反了DRY(“不要重复自己”)原则。@jim。当我输入视图时,我将音频数据提取到这些数组中。当我离开视图并重新输入时,我想“擦除”这些数组,以便它们可以填充新的音频数据。我尝试重新调用数组,但这会导致我的内存使用率上升。建议:myStruct[I]。array1=calloc(asize,sizeof*myStruct[I].array1).No cast和sizeof object,而不是sizeof(type)。您所说的“擦除”是什么意思?为什么您认为需要这样做?William建议的原因是1)强制转换抑制可能指示运行时错误的编译时警告;应尽可能避免这些警告2)重复该类型很容易出错——如果数组的类型已更改,但calloc参数未更改,则会分配错误的数量,这可能导致难以找到的崩溃。这违反了“不要重复”的原则。@jim。当我进入一个视图时,我将音频数据提取到这些数组中。当我离开视图并重新输入时,我想“擦除”这些阵列,以便它们可以填充新的音频数据。我尝试重新调用数组,但这导致我的内存使用率上升。