Попытка освободить динамически выделенную память в структуре перед удалением этой структуры из массива также динамически выделяется следующим образом:
// main.c - declaration and allocation
static int nb_servers = 0; // this is incremented before the allocation
static struct server* servers = NULL;
servers = calloc(nb_servers, sizeof(struct server));
// server struct (simplified)
struct server {
wchar_t* name;
int port;
};
// populating with entries (in a loop parsing a cJSON file)
int len = MultiByteToWideChar(CP_UTF8, 0, json_name->valuestring, -1, NULL, 0);
servers[i].name = (wchar_t*)malloc(len * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, json_name->valuestring, -1, servers[i].name, len);
// calling server_remove:
// - server_name is this, obtained from ListView_GetItem:
// wchar_t server_name[512] = { 0 }; // because in the app, size is limitted to 512
// lvi.iSubItem = 0;
// lvi.cchTextMax = 512;
// lvi.pszText = server_name;
// - port_int is an int
nb_servers = server_remove(&servers, server_name, port_int, nb_servers);
// server.c
int server_remove(struct server** servers, wchar_t* name, int port, int nb_servers)
{
for (int i = 0; i < nb_servers; i++) {
if (wcscmp(name, (*servers)[i].name) == 0 && port == (*servers)[i].port)
return server_remove_idx(servers, i, nb_servers);
}
return nb_servers;
}
int server_remove_idx(struct server** servers, int index, int nb_servers)
{
free((*servers)[index].name); // name is: wchar_t* name; in struct servers
for (int i = index; i < nb_servers - 1; i++) {
(*servers)[i] = (*servers)[i + 1]; // --> C6001: Using uninitialized memory '**servers' --> why?
}
nb_servers--;
// ... then realloc or memset to 0 if empty, and return the current nb_servers
return nb_servers; // --> update static variable in main with returned value
}
Однако VS2019 выдает предупреждение C6001 (которое компилятор не регистрирует какпредупреждение после сборки, кстати), как показано в коде выше. Это появилось после того, как я добавил вызов free
перед циклом. Код выполняется без исключений с вызовом free
или без него.
Вопросы:
- Почему VS предупреждает об этом?
- Если свободного места нет, верно ли, что это приведет к утечке памяти, и потребление памяти будет расти по мере добавления и удаления элементов из массива
servers
struct?
EDIT 1 Добавлено объявление, распределение и причина, по которой nb_servers не передается в качестве указателя. Добавлен также код, вызываемый из main (server_remove).