繁体   English   中英

在 C 中返回 static arrays 以避免 ZCD69B4957F06CD818DZB3D61 泄漏是一种好习惯吗?

[英]Is it good practice to return static arrays in C to avoid memory leaks?

我对使用 static arrays 作为函数中的返回值来避免相当复杂的使用free()有一些疑问。

我负责解决 C 程序中的一些 memory 泄漏。 当直接将宏作为 function 参数调用时,就会发生这些泄漏:

snprintf( ..., MACRO, ...);

当满足某些条件时,此宏调用一个 function 使用malloc()分配 memory:

#define MACRO ({ \
    char * problematicVariable = ... ? problematicFunction(NULL) : fixedValue; \
    // Some if statements... 
    problematicVariable; \
})

promlematicFunction()MACRO在程序中实现的方式使得无法正确释放 memory 除非进行大量更改,因此我碰巧找到的解决方法是在复制 memory 后直接在problematicFunction()中释放它static 数组中的值:

char *problematicFunction(char *arg) 
{
    char *buff = malloc(PATH_MAX);
    static char temp[PATH_MAX];

    // Doing stuff with buff...

    if (strlcpy(temp, buff, sizeof(temp)) >= sizeof(temp))
    {
        // Handle error...
    }

    free(buff);
    return(temp);
}

这样的事情可以被认为是好的做法吗? 返回值应该是只读的。

提前致谢!

这取决于上下文。 在大多数托管系统中,不赞成使用具有 static 存储持续时间的内部变量,或返回指向它们的指针。 因为这使得函数不适合多线程 - 它们不是线程安全的,除非您明确添加互斥锁或类似机制。 如果可能的话,编写 function 可重入,调用者分配和没有全局资源等被认为是最佳实践。

当然,如果 function 没有重置 static 存储资源,则只能调用一次。 这对于“单例”设计模式是有意义的,但对于通用库则不然。

然而,在独立(嵌入式等)系统中,您经常使用 static memory 池,因为此类系统通常是单线程的,并且还禁止使用堆分配。

通常,如果执行 malloc malloc代码模块也是负责清理自己的烂摊子的代码模块,则使用 malloc 的代码是正确编写的,通过提供 function 调用是所有必要的free()调用。 对于每个 malloc 调用,应该有一个相应的免费调用,在相同的代码中。 这也适用于所有其他动态资源,文件句柄,线程等。

过去约 40 年的 C 编程历史表明 memory 泄漏最常出现在您提出功能失调的库 API(例如 POSIX getline )时,其中调用者负责手动清理库分配的内容。 如果库改为使用具有私有封装的正确设计,则不应发生 memory 泄漏。

Now of course C doesn't have RAII or destructors, so instead C programmers using a library must be trusted to activate their brain and call a function foo_cleanup() if the "foo library" provides that one and tells the programmer to call it when他们是使用资源完成的。

返回 static 缓冲区是可以的,但仅限于单线程环境。 标准 C 库中的许多函数都是以这种方式实现的(例如 strerror 函数)。 如果要使它们成为线程安全的,则必须将缓冲区作为参数传递给 function (strerror_r)。 在这种情况下,调用者是否在 static、动态 memory 或堆栈上分配缓冲区(这非常灵活,但要注意嵌入式系统上的堆栈溢出:))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM