3

可能重复:
指针作为第二个参数而不是返回指针?

我经常看到这个:

Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);

让 init 函数返回指针不是更干净吗?

Monkey* test = Monkey_New();

为什么经常以第一种方式进行?

4

2 回答 2

7

这两种设计在功能上截然不同。你要问的那个把分配的负担放在调用者身上。这有一个巨大的优势,即malloc如果对象不必超过调用者,则可以避免动态存储();它可以存储在自动变量中。这也意味着,假设 init 函数不必获取更多资源,您可以拥有一个无故障 API,调用者不必检查故障。另一方面,它要求将结构的定义(至少大小)暴露给调用模块,这意味着如果更新库代码以使用更大大小的对象,则必须重新编译调用者;因此,对于旨在拥有长期稳定 ABI 的共享库来说,这可能是负面的。

在您指出的替代设计中,获取存储的负担由被调用者(库函数)承担,并且它必须使用动态存储(malloc),因为自动存储在返回给调用者后无法生存。这个更抽象更干净,

于 2012-08-15T18:32:23.790 回答
-1

这完全取决于开发人员使用的命名约定。考虑到这一点:

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Default_Constructors

对于 c++ 和 c,告诉你使用 new 并接受参数来帮助初始化,返回初始化的值。以前不是这样的,因为那时候是个蛮荒的世界。为了体面,使用 Monkey_New();

于 2012-08-15T18:31:20.343 回答