如何安全地处理 C 中的内存分配错误?

问题描述 投票:0回答:1

我正在开发一个 C 程序,需要为结构数组动态分配内存。我知道使用 malloc 有时会失败,返回 NULL。但是,我不确定处理这些情况以防止未定义行为或内存泄漏的最佳实践。

这是我的代码的简化版本:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
    char name[50];
} Item;

int main() {
    int n;
    printf("Enter the number of items: ");
    scanf("%d", &n);

    Item *items = (Item *)malloc(n * sizeof(Item));

    if (items == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        return 1;
    }

    free(items);
    return 0;
}

我的问题是:

  1. 我当前的错误处理足以检测内存分配失败吗?
  2. 我可以采取哪些额外步骤来确保大型应用程序中稳健的内存管理?
  3. C 中是否有任何特定的调试技术来跟踪内存泄漏或分配问题?

任何指导或最佳实践将不胜感激!

c debugging memory malloc
1个回答
0
投票
  1. 我当前的错误处理足以检测内存分配失败吗?

代码中的主要问题与

malloc
并不真正相关,而是您采用未经净化的输入并将其直接提供给程序。您应该检查
scanf
是否失败。或者更好的是,尽可能完全避免
stdio.h

在专业程序中,您需要健全性检查

n
是否在给定的范围内。使用有符号整数来表示数组大小也是没有意义的,因为它永远不可能为负数。


  1. 我可以采取哪些额外步骤来确保大型应用程序中稳健的内存管理?

总的来说,这是一个很好的做法:

  • 将用于动态内存的所有指针初始化为 NULL。
  • 调用
    free
    后立即将每个指针设置为 NULL。

此外,对于少量内存,通常不需要首先动态分配内存。在大多数情况下,只有几百字节的数据可以安全地分配在堆栈上。


  1. C 中是否有任何特定的调试技术来跟踪内存泄漏或分配问题?

静态分析动态分析的工具。

静态分析器在编译时检查代码(超出编译器已经可能或可能不检查的范围),例如数组越界访问、悬空指针错误等。动态分析器在程序运行时检查程序是否存在错误,并且能够通过这种方式发现内存泄漏。

示例:如今,gcc 有一些用于静态和动态分析的选项,请查看仪器选项。例如

-fsanitize=address
,它可以发现很多与内存相关的问题。对于其他免费开源选项,还有 Clang-Tidy、Valgrid、Frama-C 等工具。

© www.soinside.com 2019 - 2024. All rights reserved.