2010-11-08 138 views
7

对于防爆:从c中的函数返回指针是否是好习惯?

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

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

我不知道这是在C好的做法呢?

+0

根据目前的答案,这显然是一个主观问题。似乎没有确定这种编码实践的优劣的客观标准,并且有争论和反对的论据。 – 2010-11-08 00:30:59

+1

@Mark:那是无稽之谈。当然,有人赞同和反对返回指针,但那是因为它有时是一个明智的事情,有时候不是。一个好的答案,因为你似乎有疑问,这将解释*当*返回一个指针是一个好习惯,*为什么*它是/不是。 – jalf 2010-11-08 02:19:15

+0

而下一次您决定投票结束问题时,我建议您在点击它之前阅读最近的原因。紧密的原因并不是说“主观”。它说“主观和议论”。这是“论证性”的部分,非常重要。毕竟,没有人想要一场火焰战争。但是,这个问题与其他许多主观问题一样,可以客观地回答。例如,@ DGM的答案是客观的。它观察了这种做法的普遍性,解释了如何完成返回指针,并解释了OP示例的问题。 – jalf 2010-11-08 02:21:51

回答

13

返回指针是相当普遍的。需要解决的问题或纪律是确定释放记忆的责任在哪里。这个例子的味道,因为它不清楚它需要在main()中free'd。

+2

更正:从整个代码示例中可以看出,但如果API用户无法访问“point()”的代码,则不清楚。当一个函数返回一个指针时,文档是否需要'free()'-d(或者需要使用其他更专用的清理)。 – 2010-11-08 00:22:12

+0

是的,当功能正好在你面前时很容易。当它被埋在10,000线库中并不容易。 :) – DGM 2010-11-08 13:34:33

8

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

+3

不同意。如果需要更多的清理而不是'free()',那么是的,添加一个析构函数。但是,如果你的清理函数不过是'void release(mytype * p){free(p); }'那么你的清理函数是不必要的。你可以记录任何使用你的数据类型的人需要调用'free()'就像你可以调用你自定义的释放/析构函数一样容易。另外,每个人都知道'free()'做了些什么。 – 2010-11-08 00:19:32

+7

@Chris:使用release_point()函数可以确保,如果将来需要进行清理,则不需要重构整个应用程序。 – 2010-11-08 00:25:56

+4

同意,但点应该被称为像create_point()。这样,它使我立即认为我应该在以后消灭这一点。 – 2010-11-08 00:32:57

1

如果您知道哪些函数返回必须被释放的指针(例如在函数名中使用createnew这个词),那么它可以更容易地管理您的内存。

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

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

3

我会主张永远有自己的函数来释放库中返回的内存,除非你返回一些不重要的东西,比如字符串。

原因是,如果你改变你正在返回的结构,使得一个简单的free将不再是足够的(因为你添加到返回的对象指针分配的内存本身需要被释放) ,客户不需要更改他们的代码;你可以改变你现有的免费功能。

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

0

这通常是很好的做法,但是你的例子是少数情况下非常糟糕的做法之一。你绝对不应该使用动态分配和指针来处理那些很小但不包含(并且永远不需要包含)指针本身的对象。获取4字节的intmalloc一旦考虑了簿记开销,至少会使用16个字节,但也许更重要的是,这意味着您不得不担心可能的分配失败(以及如何处理它们)以及管理何时释放对象。

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

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

过程的一个时间也许更合理分配,并返回一个指针这样的对象是,当你分配他们的数组

相关问题