【问题标题】:OS API allocates members in struct. Free just the struct or every member first?OS API 在结构中分配成员。只释放结构还是先释放每个成员?
【发布时间】:2009-10-26 08:40:46
【问题描述】:

假设我们有一个 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);

这样对我来说似乎非常复杂。特别是如果结构有很多很多需要释放的成员。
有没有更好的方法来做到这一点?

感谢您帮助我解决这个问题!

【问题讨论】:

  • 可能也想用 C++ 标记这个婴儿。
  • 非常感谢为我修复格式的人!

标签: c++ memory struct pointers memory-leaks


【解决方案1】:

IIUC,您需要过度分配超出结构大小的缓冲区,以适应任何输出字符串。 EnumPrinters 会告诉你内存块是否太小。由于您无法预先知道需要多少内存,因此您通常调用它两次:一次是为了了解所需的内存量,第二次是使用适当大小的缓冲区。然后,您使用与分配相同的 API(例如 malloc/free)释放缓冲区。

【讨论】:

  • 啊。这就说得通了!这就是我实际上正在做的事情(不是我的例子的一部分。我应该这样做)。非常感谢您向我解释这一点!
猜你喜欢
  • 2017-07-27
  • 2021-06-23
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2017-05-07
  • 2021-08-25
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多