可能重复:
指针作为第二个参数而不是返回指针?
我经常看到这个:
Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);
让 init 函数返回指针不是更干净吗?
Monkey* test = Monkey_New();
为什么经常以第一种方式进行?
可能重复:
指针作为第二个参数而不是返回指针?
我经常看到这个:
Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);
让 init 函数返回指针不是更干净吗?
Monkey* test = Monkey_New();
为什么经常以第一种方式进行?
这两种设计在功能上截然不同。你要问的那个把分配的负担放在调用者身上。这有一个巨大的优势,即malloc
如果对象不必超过调用者,则可以避免动态存储();它可以存储在自动变量中。这也意味着,假设 init 函数不必获取更多资源,您可以拥有一个无故障 API,调用者不必检查故障。另一方面,它要求将结构的定义(至少大小)暴露给调用模块,这意味着如果更新库代码以使用更大大小的对象,则必须重新编译调用者;因此,对于旨在拥有长期稳定 ABI 的共享库来说,这可能是负面的。
在您指出的替代设计中,获取存储的负担由被调用者(库函数)承担,并且它必须使用动态存储(malloc
),因为自动存储在返回给调用者后无法生存。这个更抽象更干净,
这完全取决于开发人员使用的命名约定。考虑到这一点:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Default_Constructors
对于 c++ 和 c,告诉你使用 new 并接受参数来帮助初始化,返回初始化的值。以前不是这样的,因为那时候是个蛮荒的世界。为了体面,使用 Monkey_New();