代码之家  ›  专栏  ›  技术社区  ›  user257111

calloc内部函数

  •  1
  • user257111  · 技术社区  · 14 年前

    看看刚才问过的这个问题: Inconveniences of pointers to static variables 那么,这样做会被认为是不好的做法吗?

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

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

    5 回复  |  直到 14 年前
        1
  •  5
  •   R Samuel Klatchko    14 年前

    这不是坏的做法,但它很容易造成内存泄漏(调用方必须记住释放内存)。

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

    char* strpart_alloc(char* string, int start, int count)
    
        2
  •  3
  •   anon    14 年前

    如果您将指向内存的指针返回到外部世界,那么在函数内部动态分配内存总是可以的,这样其他的东西就可以释放它,或者在函数内部释放它。

        3
  •  1
  •   Reed Copsey    14 年前

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

    你的假设是正确的-记忆不会自动释放。

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

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

        4
  •  1
  •   Nathan Kidd    14 年前

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

        5
  •  1
  •   AnT stands with Russia    14 年前

    这不是一个坏习惯。函数返回 malloc -Ed(或 calloc -d)内存成为其外部规范的一部分。打电话的人有责任 free 当它不再需要的时候。

    但它并不漂亮。它是不雅的,因为它1)强制使用动态内存,而调用者可能更愿意避免使用它;2)强制使用特定的 友善的 动态存储器 马洛克 -当调用者可能更喜欢使用自己的分配机制时。