处理带有一些字符串的输出结构的最佳方法是什么?
struct info
{
wchar_t * text;
size_t text_len;
}
void Foo(struct info * output);
用户需要自己分配文本
输出可循环回收
很难知道需要分配多少内存,如果要存储输出可能会浪费内存(例如,将列表保存为项目)
在Foo
中分配文字 用户释放输出的痛苦,因为他必须先释放每个文本(可以使FreeStructInfo缓解痛苦)从Foo
中分配输出 Foo可以在struct info中嵌入文本,用户只需要免费输出即可释放所有内容
有利于存储(Foo知道需要分配多少),
但如果在循环中用作短期变量,可能会对记忆造成很大压力,因为它无法回收。
Windows使用“用户需要自己分配文本”,要么分配足够的,要么需要调用该函数两次以获得所需的大小。
答案 0 :(得分:3)
没有一种最佳方式 - 您建议的所有选项都会在某个时间使用。重要的是要很好地记录它,并在可行的情况下使库中的所有函数保持一致。
答案 1 :(得分:1)
您可以使用第一个习惯用法(用户分配),如果字符串的空间不足,则需要重新分配。如果您和用户同意使用相同的分配(如malloc / free),这将有效。这将为您提供最佳性能(不会为每次迭代分配),并且对用户来说仍然很方便。
使用这个习惯用法,分配的存储空间会根据需要增长,但用户可以随时选择通过重新分配较小的存储空间来“收缩”它(如果需要,它将再次开始增长)。
答案 2 :(得分:0)
lothar总结了第一个成语的优点 - 很可能它是一般解决方案的最佳选择。
但是,有时第3个选项(已修改)更好 - 如果您有很多要输出的话。为了避免内存压力,您可以将池添加到混合中。