2

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

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;
}

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

4

5 回答 5

7

这不是坏习惯,但它很容易造成内存泄漏(调用者必须记住释放内存)。

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

char* strpart_alloc(char* string, int start, int count)
于 2010-02-09T18:34:17.030 回答
4

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

于 2010-02-09T18:33:28.013 回答
2

嗯,很危险。我会尽量避免它。

您的假设是正确的 - 内存不会自动释放。

问题是这里的返回值是在堆上分配的内存,函数的调用者必须记住释放。您在这里分配的内存不会(由您)释放。对 API 的用户施加限制总是一个坏主意。

有时(很少)这是无法避免的,所以如果你这样做,请确保非常清楚地记录它。

于 2010-02-09T18:32:16.080 回答
2

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

于 2010-02-09T18:35:14.547 回答
2

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

但它并不优雅。它是不优雅的,因为它 1) 强制使用动态内存,而调用者可能更愿意避免它,并且 2) 当调用者可能更喜欢使用自己的动态内存时,它会强制使用一种特定类型的动态内存——- malloced分配机制。

于 2010-02-09T18:41:22.903 回答