API 设计是告诉 API 的使用者分配内存的最佳做法
API Design is it best practice to tell the consumer of an API to allocate the memory?
我正在尝试用C语言实现一个应用软件。 我最终设计了多层。从每个层公开自己的 API,也可以调用另一个层的 API。
Example:
Layer 1:
// invoking layer2 API.
// allocating mystrcuture here
getDetailsOf (mystructure);
Layer 2:
getDetailsOf ( mystrcuture)
{
Fill up the details in mystrcuture,
}
我遵循了上述方法。另一种方法是将分配mystrcuture的责任释放给getDetailsOf()函数,并让他返回新分配的mystructure。
请帮助我,这是正确的做法?
在这种情况下,是的;我认为调用者应该分配内存(当然,您需要获取指向结构的指针)。 您知道所需的确切大小,那么为什么不让调用方按照他们认为合适的方式分配内存呢? 没有理由在这里强制实施动态分配。
编辑:这个答案是以C为中心的。 您应该在此处指定您正在谈论的语言。
由于C++允许返回一个可以处理其析构函数中内部部分的释放的对象,因此我假设您的问题与 C 兼容的 API 有关。
这两种方法都是可以接受的。如果 mystructure 足够简单(见下文),调用者应该处理分配和解除分配,并将指针传递给底层;如果它太复杂,被调用方应为其分配内存,并返回一个指针,当调用方不再需要它时,应释放该指针。
恕我直言,规则应该是如果所有必要的内存大小恒定或在调用之前知道,则分配应该是调用方的责任。如果不是这种情况,例如可变长度的 char 数组、任意大小的位图......,则应由被调用方负责。
为了协调起见,如果您希望 API 的所有函数都使用相同的逻辑,则可以减轻此答案。
相关文章:
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- Windows API SIZE_T在内存和控制台中不显示相同的值
- 为什么创建进程 API 调用会导致内存访问冲突?
- MATLAB API用于使用MatgetDir的C例外:Matrix :: Serialize ::在内存位置内置
- 在 cplex c++ 音乐会 api++ 中处理非常大的问题而不会耗尽内存
- Valgrind 错误和内存泄漏与 Python/C API
- Python C API:将 PyObjects 分配给字典会导致内存泄漏
- C 控制台程序中的内存泄漏调用Windows API
- C 内存泄漏在stgstorage API中
- 调试Win32 API应用程序以进行内存泄漏
- 内存中进程的实际起始地址/W32调试API
- 使用FileStorage API加载的cv::Mat的可用内存
- API 设计是告诉 API 的使用者分配内存的最佳做法
- 清理内存(也许是win32 api)
- API内存:堆还是堆栈?(C++)
- 在WinAPI、POSIX或API-OS等价物的其他扩展中,是否存在来自C++11的所有级别的内存屏障
- 将波形加载到内存中,然后使用Win32 API异步播放声音
- Lua C API内存泄漏?(valgrind)
- 共享内存 API,其中进程可以将共享内存附加到其他进程
- 是否可以在内存中使用Clang c++ API编译Clang源代码?