【问题标题】:Calloc inside functionCalloc内部函数
【发布时间】:2011-01-14 22:42:21
【问题描述】:

看看刚刚提出的这个问题: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;
}

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

【问题讨论】:

    标签: c pointers memory-management calloc


    【解决方案1】:

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

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

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

    有时(很少)这是无法避免的,因此如果您这样做,请务必清楚地记录下来。

    【讨论】:

    • 好的,谢谢,我不认为它会像这样被释放,所以很高兴知道。鉴于上一个问题的答案,无论如何编写一个安全的替代方案是相当微不足道的。再次感谢。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 匈牙利风格的符号可以真正发挥作用的地方之一(如果开发人员甚至知道_alloc 的含义......)
      • 我喜欢这个主意。好的,那么正确的方法是使用 char* ptr = strpart_alloc(...);用 ptr 做事;免费(ptr)?
      • @Ninefinger - 是的,这是调用此类函数的正确方法。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-14
          • 1970-01-01
          • 2021-12-25
          • 2014-11-13
          • 2011-05-05
          • 2017-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多