gpt4 book ai didi

c - 在函数中隐藏内存分配是不好的做法吗?

转载 作者:太空狗 更新时间:2023-10-29 14:54:39 25 4
gpt4 key购买 nike

我是否应该期望用户提供足够大小的内存块,例如,用于将文件复制到缓冲区中?或者我应该自己分配内存,并期望用户在完成后释放它?例如,函数 strdup() 自己分配内存,但函数 fread() 只需要足够大小的缓冲区。

最佳答案

这取决于 - 我见过 C API 为此使用各种模式,例如:

  • 需要提供缓冲区和缓冲区大小的函数,并返回所需的大小(以便在缓冲区被截断时调整缓冲区大小);如果您只是询问缓冲区应该有多大,其中许多允许将 NULL 作为缓冲区传递;这允许调用者使用现有缓冲区或分配适当大小的缓冲区,尽管有两个调用;
  • 分离函数以获得所需的大小并填充缓冲区;与上面相同,但界面更清晰;
  • 需要缓冲区和缓冲区大小的函数,但如果将 NULL 作为缓冲区传递,则可以自行分配缓冲区;最大的灵 active 和简洁性,但函数签名可能会令人困惑;
  • 只返回一个新分配的字符串的函数;易于使用并避免因无人看管的截断而引起的错误,但如果性能是一个问题则不灵活;此外,要求调用者记住释放返回值,如果使用堆栈分配的缓冲区,则在上述情况下可以避免这种情况;
  • 函数返回一个指向静态缓冲区的指针,然后调用者负责对它做任何事情;极易使用,极易误用;在多线程的情况下(需要线程本地存储)和重入是一个问题时需要小心。

最后一个通常是个坏主意——它带来了重入和线程安全问题;之前的一个可以使用但可能会带来效率问题 - 如果我已经有足够大的缓冲区,我通常不想在分配上浪费时间。所有其他的通常都很好。

但是除了接口(interface)的细节之外,如果你分配东西和/或返回指针,最重要的一点是清楚地记录谁拥有指向的内存——它是你库中的静态对象吗?它是指向调用者提供的某个对象内部的指针吗?它是动态分配的东西吗?调用者是否负责释放它?它只是作为参数提供的缓冲区吗?

最重要的是,如果您分配了东西,请始终指定如何释放它;请注意,如果您正在构建一个可以编译为 dll/so 的库,最好提供您自己的释放函数(即使它只是 free 的包装器)以避免之间的不匹配在同一进程中运行的不同版本的 C 运行时。此外,它避免将您的代码绑定(bind)到 C 库分配器 - 今天可能没问题,明天可能会发现使用自定义分配器可能是一个更好的主意。

关于c - 在函数中隐藏内存分配是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46063525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com