Почему я получаю C6001 при попытке освободить указатель wchar_t в структуре? - PullRequest
0 голосов
/ 12 октября 2019

Попытка освободить динамически выделенную память в структуре перед удалением этой структуры из массива также динамически выделяется следующим образом:

// 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 или без него.

Вопросы:

  1. Почему VS предупреждает об этом?
  2. Если свободного места нет, верно ли, что это приведет к утечке памяти, и потребление памяти будет расти по мере добавления и удаления элементов из массива servers struct?

EDIT 1 Добавлено объявление, распределение и причина, по которой nb_servers не передается в качестве указателя. Добавлен также код, вызываемый из main (server_remove).

...