为什么许多init函数都使用指针初始化,而不是返回有效的?

时间:2012-08-15 18:23:58

标签: c pointers init

  

可能重复:
  pointer as second argument instead of returning pointer?

我看到了很多:

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

让init函数返回指针会不会更清晰?

Monkey* test = Monkey_New();

为什么经常以第一种方式完成?

2 个答案:

答案 0 :(得分:7)

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

在您指出的替代设计中,获取存储的负担在被调用者(库函数)上,并且必须使用动态存储(malloc),因为自动存储将无法在返回调用者后继续存在。这更抽象,更清洁,

答案 1 :(得分:-1)

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

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

对于c ++和c,告诉你使用new并使用参数来帮助初始化,返回初始化的值。在过去,情况并非如此,因为当时它是一个狂野的世界。为了体面,请使用Monkey_New();