OS API распределяет членов в структуре. Освободите только структуру или каждого члена в первую очередь? - PullRequest
2 голосов
/ 26 октября 2009

Допустим, у нас есть массив PRINTER_INFO_2, например:

PRINTER_INFO_2* printers = (PRINTER_INFO_2*)malloc(sizeof(PRINTER_INFO_2) * 64); // room for 64 items

Затем мы вызываем EnumPrinters(), чтобы получить список локально установленных принтеров:

EnumPrinters(
    PRINTER_ENUM_LOCAL,
    NULL,
    2,
    (LPBYTE)printers,
    ...);

Вот информация о структуре для PRINTER_INFO_2. Теперь строковые члены имеют тип LPTSTR, поэтому они не хранятся внутри самой структуры.

Что мне сейчас интересно, так это то, могу ли я просто позвонить free(printers), когда я закончу, или это приведет к утечке памяти (все эти строки не освобождаются)?

Должен ли я вызывать free() для каждого строкового члена, как показано ниже?

free(printers[i].pServerName);
free(printers[i].pPrinterName);
free(printers[i].pShareName);
...
free(printers);

Мне так ужасно сложно. Особенно, если в структуре много, много членов, которые должны быть освобождены.
Есть ли лучший способ сделать это?

Спасибо, что помогли мне с этим!

1 Ответ

1 голос
/ 26 октября 2009

IIUC, вам нужно перераспределить буфер за пределы размера структуры, чтобы приспособить для любых выходных строк. EnumPrinters скажет вам, если блок памяти был слишком мал. Поскольку вы не можете заранее знать, сколько памяти вам потребуется, вы обычно вызываете ее дважды: один раз, чтобы узнать объем необходимой памяти, и второй раз с буфером соответствующего размера. Затем вы освобождаете буфер с тем же API, который вы использовали для выделения (например, malloc / free).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...