2009-10-26 80 views
2

比方說,我們有PRINTER_INFO_2數組是這樣的:OS API在struct中分配成員。首先釋放結構或每個成員?

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); 

對我來說這似乎很複雜。特別是如果結構有許多需要釋放的成員。
有沒有更好的方法來做到這一點?

感謝您幫助我解決這個問題!

+0

可能也想用C++標記這個寶寶。 – 2009-10-26 08:41:49

+0

非常感謝修復格式的人! – Kate 2009-10-26 08:53:10

回答

1

IIUC,您需要將緩衝區超出結構的大小,以適應任何輸出字符串。 EnumPrinters會告訴你內存塊是否太小。由於您無法預先知道需要多少內存,因此通常會調用它兩次:一次是要了解所需的內存量,而另一次是使用適當大小的緩衝區。然後您使用您用於分配的相同API(例如malloc/free)釋放緩衝區。

+0

啊。這就說得通了!這就是我實際上正在做的事情(這裏不是我的例子的一部分,我應該這樣做)。非常感謝你向我解釋這個! – Kate 2009-10-26 09:07:56