free():第二个元素的无效指针
free(): invalid pointer at 2nd element
我得到一个
free(): invalid pointer:
当试图释放在 db->rows 中分配的第二个地址时(下面标记为 //ERROR)
typedef struct {
int max_data;
int max_rows;
Address *rows;
} Database;
void Database_create(Connection *conn) {
conn->db->rows = malloc(sizeof(Address) * conn->db->max_rows);
int i = 0;
for (i = 0; i < conn->db->max_rows; i++) {
Address *rows = conn->db->rows;
rows[i] = *Address_create(i, 0);
}
}
void Database_destroy(Database *db) {
if (db) {
int i = 0;
for (i = 0; i < db->max_rows; i++) {
Address_destroy(&db->rows[i]);
}
}
}
Address *Address_create(int id, int set) {
Address *addr = malloc(sizeof(Address));
addr->name = malloc(sizeof(char) * max_data);
addr->email = malloc(sizeof(char) * max_data);
addr->id = id;
addr->set = set;
return addr;
}
void Address_destroy(Address *addr) {
if (addr) {
if (addr->name) free(addr->name);
if (addr->email) free(addr->email);
free(addr); // ERROR HERE
}
}
下面的语句看起来不像一个有效的语句,它复制了分配指针的内容而不是分配指针本身。
rows[i] = *Address_create(i, 0);
您需要将 conn->db->rows 的数据类型更改为 Adress **
,然后如下分配内存
conn->db->rows = malloc(sizeof(Address *) * conn->db->max_rows);
然后设置行数[i]如下
rows[i] = Address_create(i, 0);
然后如下释放每一行
Address_destroy(db->rows[i]);
还根据更改后的数据类型更改对行[i] 的所有引用。
我得到一个
free(): invalid pointer:
当试图释放在 db->rows 中分配的第二个地址时(下面标记为 //ERROR)
typedef struct {
int max_data;
int max_rows;
Address *rows;
} Database;
void Database_create(Connection *conn) {
conn->db->rows = malloc(sizeof(Address) * conn->db->max_rows);
int i = 0;
for (i = 0; i < conn->db->max_rows; i++) {
Address *rows = conn->db->rows;
rows[i] = *Address_create(i, 0);
}
}
void Database_destroy(Database *db) {
if (db) {
int i = 0;
for (i = 0; i < db->max_rows; i++) {
Address_destroy(&db->rows[i]);
}
}
}
Address *Address_create(int id, int set) {
Address *addr = malloc(sizeof(Address));
addr->name = malloc(sizeof(char) * max_data);
addr->email = malloc(sizeof(char) * max_data);
addr->id = id;
addr->set = set;
return addr;
}
void Address_destroy(Address *addr) {
if (addr) {
if (addr->name) free(addr->name);
if (addr->email) free(addr->email);
free(addr); // ERROR HERE
}
}
下面的语句看起来不像一个有效的语句,它复制了分配指针的内容而不是分配指针本身。
rows[i] = *Address_create(i, 0);
您需要将 conn->db->rows 的数据类型更改为 Adress **
,然后如下分配内存
conn->db->rows = malloc(sizeof(Address *) * conn->db->max_rows);
然后设置行数[i]如下
rows[i] = Address_create(i, 0);
然后如下释放每一行
Address_destroy(db->rows[i]);
还根据更改后的数据类型更改对行[i] 的所有引用。