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。当我进入一个视图时,我将音频数据提取到这些数组中。当我离开视图并重新输入时,我想“擦除”这些阵列,以便它们可以填充新的音频数据。我尝试重新调用数组,但这导致我的内存使用率上升。