如何在C中完全删除动态数组而不仅仅是单个元素
我必须创建一个函数来删除整个动态数组,我很难思考如何处理存储的数据,因为如果我只使用free()我会丢失内存 我在其他问题上找不到任何帮助,因为他们主要讨论删除单个元素,但我想基本上销毁数组。如何在C中完全删除动态数组而不仅仅是单个元素,c,C,我必须创建一个函数来删除整个动态数组,我很难思考如何处理存储的数据,因为如果我只使用free()我会丢失内存 我在其他问题上找不到任何帮助,因为他们主要讨论删除单个元素,但我想基本上销毁数组。 谢谢经验法则是每个malloc都应该有一个免费的 如果是数组,则所有数据都直接存储在数组的内存中。释放数组将释放所有元素 free(people); 例如,假设我有一个名为person的结构 typedef struct { int id; char name[20]; } person; 如
谢谢经验法则是每个
malloc
都应该有一个免费的
如果是数组,则所有数据都直接存储在数组的内存中。释放数组将释放所有元素
free(people);
例如,假设我有一个名为person
的结构
typedef struct {
int id;
char name[20];
} person;
如果我想存储8个结构,我会分配一个足以容纳8个结构的数组
person *people = malloc(sizeof(person) * 8);
我分配给数组的每个对象都会复制到数组中
// `p` uses automatic stack memory which is managed for you
person p = { .id = 23, .name = "Yarrow Hock" };
people[0] = p; // p is copied to the array's heap memory
for( int i = 0; i < 8; i++ ) {
person *p = malloc(sizeof(person));
p->id = i;
p->name = "Some One";
people[i] = p;
}
完成后,我将释放阵列。这将释放所有结构
free(people);
一个malloc,一个免费
指针数组是不同的。如果我想存储一个包含8个指针的数组到我的结构,我会为8个指针分配空间
person **array = malloc(sizeof(person*) * 8);
然后我必须为每个元素分配空间。只有指针被复制到数组中
// `p` uses automatic stack memory which is managed for you
person p = { .id = 23, .name = "Yarrow Hock" };
people[0] = p; // p is copied to the array's heap memory
for( int i = 0; i < 8; i++ ) {
person *p = malloc(sizeof(person));
p->id = i;
p->name = "Some One";
people[i] = p;
}
这取决于代码的设计方式。例如,如果我在数组中存储指向每个人姓名的指针
char *names = malloc(sizeof(char*));
for( int i = 0; i < 8; i++ ) {
names[i] = people[i]->name;
}
// Free only the array.
free(names);
他们也需要自由。这使数组元素的内存管理变得复杂。您需要了解如何管理阵列元素的详细信息
for( int i = 0; i < 8; i++ ) {
free(people[i]->name);
free(people[i]);
}
free(people);
我不明白-您想如何删除数组但保留数据?我想说的是,如果我只使用free(),我会不会丢失内存并出现valgrind错误?您需要显示示例代码。如果正在分配的数组是指针数组,然后指向更多分配,然后,您必须遍历数组并释放每个分配的内存,然后才释放原始数组。否则,您不会像在任何VLA中填充0或其他表示空闲或已使用的内容一样“删除元素”。只需删除您使用malloc
等分配的内容。如果您只调用malloc
一次来创建数组,那么您只需要使用相同的数组调用free
一次。如果多次调用malloc
,一次调用一个指针数组,然后再次调用数组中的每个指针以分配它指向的对象,则反向过程:首先为数组中的每个指针调用free
,然后为数组本身调用一次。
void free_the_people(gpointer data) {
person *p = (person*)data;
printf("Deallocating %s\n", p->name);
free(p->name);
free(p);
}
int main() {
GPtrArray *people = g_ptr_array_new_full(8, free_the_people);
// Allocate memory for the struct.
person *p = malloc(sizeof(person));
// Allocate memory for the string.
p->name = malloc(40);
strcpy(p->name, "Yarrow Hock");
p->id = 23;
// Copy the pointer to the array.
g_ptr_array_add(people, p);
// Call free_the_people on each element, then deallocate the array.
g_ptr_array_unref(people);
}