c - 我应该在发生 fatal error 时释放分配的内存吗?

标签 c memory free fatal-error quit

有时,诸如库错误之类的事情将不允许我的程序进一步继续,例如调用 SDL_Init变坏了。我应该尝试释放尽可能多的内存,还是直接退出?我还没有看到任何人们不会放弃的小例子,但我不够聪明,无法阅读《DOOM-3》代码或类似的内容。

最佳答案

我不会。如果您的程序由于程序中发生的一些奇异的、不可预见的事情而崩溃,那么尝试释放任何分配的堆内存甚至可能是毫无意义的。
我认为如果可以的话,最好只调用 exit (EXIT_FAILURE),并让操作系统尽可能回收您分配的内存。

但是,我会尝试清理您使用/声明/打开的任何其他资源,这些资源也可能导致泄漏。关闭尽可能多的打开的文件指针,或刷新周围的任何缓冲区。
除此之外,我想说:将其留给操作系统。你的程序已经崩溃,或者正在崩溃:在不可预见的情况下尝试自行清理可能是毫无意义的,或者 - 谁知道 - 最终弊大于利。

当然,如果“库错误”您的意思是:

MYSQL *connection = mysql_init();
if (connection == NULL)
{//connection could not be initiated
    //what to do here?
}

或者,没有库:

char **arr_of_strings = malloc(200*sizeof(char *));
//some code
arr_of_strings[0] = calloc(150, sizeof(char));
//some more
arr_of_strings[120] = calloc(350, sizeof(char));
if (arr_of_strings == NULL)
{//ran out of heap memory
    //what do I do here?
}

所以,基本上:问题在于:您的程序必须做什么,以及您能否轻松找到解决所面临问题的方法。
例如,如果您正在编写一个 mysql 客户端,并且 mysql_init 调用失败,我认为很明显您无法继续。您可以尝试为可能发生这种情况的各种原因提供后备方案,或者您可以直接退出。我会选择后者。
在第二种情况下,很明显您已经耗尽了堆内存。如果您无论如何都要将这些字符串写入文件,则可以防止此类错误,如下所示:

int main()
{
    char **arr_str = malloc(20*sizeof(char *));
    const char *fileName = "output.txt";
    int i, j;
    int alloc_str(char ***str, int offset, int size);
    void write_to_file(const char *string, const char *fileName);
    for(i=0;i<10;++i)
    {
        if (alloc_str(&arr_str, i, 100+i) == -1)
        {
            if (i == 0) exit(EXIT_FAILURE);//this is a bigger problem
            for (j=0;i<i;++j)
            {//write what we have to file, and free the memory
                if (arr_str[j] != NULL)
                {
                    write_to_file(arr_str[j], fileName);
                    free(arr_str[j]);
                    arr_str[j] = NULL;
                }
                if (alloc_str(&arr_str, i, 100+i) != -1) break;//enough memory freed!
            }
        }
        //assign value to arr_str[i]
    }
    for(i=0;i<10;++i) free(arr_str[i]);
    free(arr_str);
    return 0;
}

void write_to_file(const char *string, const char *fileName)
{//woefully inefficient, but you get the idea
    FILE* outFile = fopen(fileName, "a");
    if (outFile == NULL) exit (EXIT_FAILURE);
    fprintf(outFile, "%s\n", string);
    fclose(outFile);
}

int alloc_str(char ***str, int offset, int size)
{
    (*str)[offset] = calloc(size, sizeof(char));
    if ((*str)[offset] == NULL) return -1;
    return 0;
}

在这里,我尝试创建一个字符串数组,但是当内存不足时,我只会将一些字符串写入文件,释放它们占用的内存,然后继续。然后我可以返回到我写入了必须从内存中清除的字符串的文件。在这种情况下,我可以确保,尽管它确实会导致一些额外的开销,但我的程序将运行得很好。
但在第二种情况下,释放内存是必须的。我必须释放程序继续运行所需的内存,但考虑到所有因素,这是一个简单的修复。

关于c - 我应该在发生 fatal error 时释放分配的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19858361/

相关文章:

python - 将 dict 转储到 json 时遇到问题?

c - 为什么我的指针在释放后不为空?

c - free() 使用不同的指针释放相同的堆内存

C程序导致内存泄漏?

C套接字编程

c - 为什么使用指针到指针会出现内存访问冲突错误

c - 动态存储器C

c - 交换字符串

java - 碎片化内存是什么样子的?

c - 在C标准库函数中如何确定返回char指针是否需要空闲?