
1 Radeon 2013-01-12 11:02:58 +08:00 库函数不要返回自己"malloc"出来的数据,原因是客户代码和库函数有可能不使用一致的内存管理器 如果是自己的代码内部,又都使用标准的C的malloc(),可以用第一种方式返回数据 |
2 Radeon 2013-01-12 11:10:49 +08:00 补充一下,有时候库函数确实需要返回大小在调用前不确定的数据,由于大小不确定,所以调用方很难提前分配 方法有二 1. 提供一个查询函数,查询返回数据有多大,还是由调用方分配 2. 提供一个释放内存的函数,这样库函数可以安心用自己的内存管理器来动态分配内存 |
3 Sherlockhlt OP @Radeon 什么情况下会使用不一致的内存管理器呢? |
4 Radeon 2013-01-12 11:54:56 +08:00 @Sherlockhlt 原因有好几种 1. 标准的malloc()不够优化。对于openssl这种lib来说,自己搞一套内存管理器,甚至关键路径用汇编都很正常 2. 库函数已经静态链接某一特定版本的malloc()了,用户代码自己可以用另一个版本。一个进程里存在两套以上的内存管理器互不干扰,虽然C语言的入门书不会提,但是是完全正常的。而且实际中的复杂应用中也很常见 3. 库函数实际上是OS的API。Kernel里的内存管理器和User land的自然不一样,想一样也不可能 |
5 Radeon 2013-01-12 11:59:27 +08:00 很多C语言的初学者以为malloc()是最底层的函数之一。很遗憾,不是。malloc()只是OS提供的user land内存管理API的二道贩子而已 |
6 Soichir 2013-01-13 10:18:25 +08:00 lz能不能举一个两种方式的例子。 为什么我觉着 返回一个结构指针 和 修改指针 参数是一个意思。。。 thx |
7 bombless 2013-01-13 10:47:07 +08:00 |
8 bombless 2013-01-13 10:48:36 +08:00 大约是上贴这个意思吧……手贱直接点了回复…… |
9 Sherlockhlt OP |
10 yuzhigang33 2013-01-13 12:36:14 +08:00 @Sherlockhlt 第二个改变不了指针的值啊,形参。如果在外面定义int *p1 = null; 把p1传进去,出来后,p1还是null。 |
11 Sherlockhlt OP @yuzhigang33 原来如此 |
12 xuan_lengyue 2013-01-13 13:07:52 +08:00 这玩意用Objective-C来类比可能更好解释。 Objective-C当中一般alloc的变量都是需要在稍后手动release的, 而非alloc函数生成的变量一般就无需稍后手动release。 其实就是约定俗成的,这块内存到底谁来管的问题。 |
13 bombless 2013-01-15 10:25:57 +08:00 看了一下回复,我想到一点:返回值最好用来指示操作是否成功,因此最好在参数列表中留一个指针的指针用于返回一个缓冲区地址。 这关键还是代码风格的问题:有的 C 函数是没有参数列表或者说参数列表是一个 void 。 对这样的函数最自然的做法就是用返回值来指示操作是否成功。 为了与这样的函数统一,最好所有的函数都用返回值来指示操作是否成功。 对于有一些函数只需要返回一个缓冲区地址的函数,可以用返回空指针的做法来指示操作失败;但如果剩余的 API 函数高度统一,那么这个函数就成为了特例并成为一个污点。 返回空指针的做法还有一个很大的缺陷:它不符合一些编译系统的语义,所以无法让原来的API自然的扩展到一些新平台,从而在 API 的移植上留下污点。而许多平台例如 CORBA、OpenCl 上的 API 都有这样的需求。 例如我很赞赏的 Scala ,虽然它也有空引用,但许多时候类似的语义靠 Option 类来表达,因此它就在与返回空指针来指示操作失败的做法上需要协调一下,在美学上难免带来一些招致争执的考量。 |
14 xdeng 2013-01-15 10:43:04 +08:00 如果是制作成dll库 或者lib库 就需要提供dll库 或者lib库 自己内部的free 最明显的是vc debug版的free 和 release版的free 不能通用。 |
15 xdeng 2013-01-15 10:44:20 +08:00 看具体情况的 |