从c中的函数返回指针是一种好习惯吗?

时间:2010-11-08 00:07:40

标签: c function pointers

对于Ex:

int *point() {
 int *q = malloc(sizeof(int));
 *q=20;
 return q;
}

int main() {
    int *a = point();
    free(a);
}

我想知道这是不是一个很好的做法?

7 个答案:

答案 0 :(得分:13)

返回指针很常见。所需要的问题或纪律是确定释放记忆的责任在哪里。这个例子很有气味,因为不清楚它是否需要在main()中被释放。

答案 1 :(得分:8)

我认为问题是免费的(a);我认为你应该添加一个release_point()函数。

答案 2 :(得分:5)

查看wikipedia page for opaque pointers上的C示例。这是一种构造代码的方法,您可以在界面的一侧完全管理内存。

答案 3 :(得分:3)

我知道返回指向已分配内存的指针的唯一真正危险是:例如,如果您的库是在Windows上编译并链接到Visual C ++运行时库(MSVCRT)的一个实例,则它是静态链接到它,并且客户端程序链接到另一个实例,例如,它链接到DLL,然后它们各自具有不同的malloc竞技场,并且程序不能释放由库返回的指针。任何这样做的尝试都可能导致程序崩溃。

答案 4 :(得分:3)

我主张总是拥有自己的函数来释放库返回的内存,除非你返回一些微不足道的东西,比如字符串。

这样做的原因是,如果你改变你返回的结构,那么简单的free将不再足够(因为你向返回的对象添加了指向自己需要的已分配内存的指针被释放,客户不需要改变他们的代码;你可以改变你现有的免费功能。

因此,拥有自己的免费功能可以将客户端与库返回的对象结构隔离开来,让您可以自由更改对象的结构,而不会影响客户端。

答案 5 :(得分:1)

如果你有一个一致的系统知道哪些函数返回必须释放的指针(例如在函数名中使用单词createnew)那么它可以更容易地管理你的记忆

int *createPoint()
{
    int *q = malloc(sizeof(int));
    if (*q)
       *q = 20;
    return q;
}

答案 6 :(得分:0)

这通常是一种很好的做法,但是你的例子是少数几个非常糟糕的做法之一。您永远不应该为单个对象使用动态分配和指针,这些对象很小并且不包含(并且永远不需要包含)指针本身。一旦考虑到簿记开销,获得带有int的4字节malloc至少使用16个字节,但更重要的是,这意味着您必须担心可能的分配失败(以及如何处理它们)并管理何时释放对象。

您不应该像这样分配的对象的一些示例:

  • 任何基本类型
  • 有序对/坐标/向量/矩阵/等。 (只要它们是固定尺寸的)
  • ip addresses
  • 颜色值

当然,分配和返回指向这些对象的指针可能是有意义的,当你分配它们的数组时。