Calloc里面的function

看看刚刚被问过的这个问题: 对静态变量指针的不便会做这样的事情被认为是不好的做法,那么呢?

char* strpart(char* string, int start, int count) { char* strtemp; int i = 0; int j = 0; int strL = strlen(string); if ( count == 0 ) { count = strL; } strtemp = (char*) calloc((count + 1), sizeof(char)); for ( i = start; i < (start+count); i++ ) { strtemp[j] = string[i]; j++; } return strtemp; } 

对不起,它编写得很快,但基本原则是 – 当在函数内部不使用静态缓冲区时,在函数内部分配内存是不好的做法吗? 我假设是因为它不会被释放,是吗? 以为我应该问。

这不是一个糟糕的实践,但它很容易造成内存泄漏(调用者必须记住释放内存)。

我喜欢做的一件事是使用命名约定来指示哪些函数可以分配。 例如,我将该function命名为:

 char* strpart_alloc(char* string, int start, int count) 

在函数内动态分配内存总是可以的做法提供你将指向该内存的指针返回到外部世界,以便其他东西可以释放它,或者在函数内自己释放它。

嗯,这很危险。 我会尽可能避免它。

你的假设是正确的 – 内存不会自动释放。

问题是这里的返回值是在堆上分配的内存,你的函数的调用者必须记住释放。 你在这里分配的内存不会(由你)发布。 将约束放在API的用户身上总是一个坏主意。

有时(很少)这是无法避免的,所以如果你这样做,一定要非常清楚地记录下来。

这样做通常很常见。 您只需在文档“API”中清楚地注明,调用者有责任在完成后释放返回的指针。

这不是一个坏习惯。 函数返回malloc -ed(或calloc -ed)内存的事实成为其外部规范的一部分。 当不再需要时,它将成为调用者的责任。

虽然它不够优雅。 它是不优雅的,因为它1)强制使用动态内存,当调用者可能更愿意避免它时,2)强制使用特定类型的动态内存 – malloc -ed,当调用者可能更喜欢使用它时自己的分配机制。