MST

星途 面试题库

面试题:C语言函数参数传递的内存管理与优化

假设有一个函数,它接收一个指向动态分配内存的指针作为参数(该内存中存储着一系列整数),函数需要对这些整数进行特定处理后释放这块内存。请编写这个函数,并确保在各种情况下(如函数调用前指针为NULL、处理过程中出现错误等)内存不会泄漏,同时从内存管理和性能优化角度解释你的实现思路。
27.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <cstdlib>

void processAndFree(int* arr) {
    // 处理指针为NULL的情况
    if (arr == nullptr) {
        return;
    }
    try {
        // 在这里进行特定处理,例如打印数组元素
        for (int i = 0; i < 10; ++i) {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
    } catch(...) {
        // 如果处理过程中出现错误,先释放内存
        std::free(arr);
        throw;
    }
    // 处理完成后释放内存
    std::free(arr);
}

内存管理思路

  1. 检查空指针:在函数开始时,首先检查传入的指针是否为NULL。如果是NULL,直接返回,避免空指针解引用导致的未定义行为。
  2. 异常处理:使用try - catch块来捕获处理过程中可能抛出的异常。一旦捕获到异常,立即释放动态分配的内存,防止内存泄漏。
  3. 正常释放:在处理完成后,使用std::free来释放动态分配的内存,确保内存被正确回收。

性能优化思路

  1. 减少不必要操作:在空指针检查后直接返回,避免了对空指针后续无意义的处理,提升了性能。
  2. 异常处理开销:虽然try - catch块会带来一定的性能开销,但在确保内存安全方面是必要的。在实际应用中,如果性能要求极高且能确定不会抛出异常,可以考虑去掉try - catch块,但同时要保证处理过程的健壮性。