You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C API实现:返回指定大小已分配数组及内存释放问题

问题解决思路

1. 先修正create函数的核心错误

你当前的create函数内存分配逻辑完全错误:InfoArray结构体本身只包含一个指针,你却直接分配了size * sizeof(Info)的内存给InfoArray*,这会导致结构体本身的内存空间不对,后续操作必然出问题。正确的逻辑是:先分配InfoArray结构体的内存,再为其内部的info指针分配对应大小的Info数组。

用C风格malloc实现(兼容C客户端)

#include <stdlib.h>

// 必须加extern "C",否则C客户端无法链接C++编译的函数
extern "C" InfoArray* create(size_t size) {
    // 先分配InfoArray结构体本身的内存
    InfoArray* array = (InfoArray*)malloc(sizeof(InfoArray));
    if (!array) return NULL;
    // 再分配Info数组的内存
    array->info = (Info*)malloc(size * sizeof(Info));
    if (!array->info) {
        // 分配失败时要释放已分配的结构体内存,避免泄漏
        free(array);
        return NULL;
    }
    return array;
}

用C++风格new实现

如果想用C++的new,同样要注意extern "C",并且正确分配结构体和数组:

extern "C" InfoArray* create(size_t size) {
    try {
        // 先new InfoArray结构体
        InfoArray* array = new InfoArray();
        // 再new Info数组
        array->info = new Info[size];
        return array;
    } catch (const std::bad_alloc&) {
        // 内存分配失败返回NULL
        return NULL;
    }
}

2. 统一内存释放方式:提供配套销毁函数

绝对不能让用户自己用delete或free,因为用户无法知道你内部用的是malloc还是new,混用必然导致崩溃。必须在API中提供对应的销毁函数,让用户调用它来释放内存:

对应malloc的销毁函数

extern "C" void destroy(InfoArray* array) {
    if (!array) return;
    // 先释放内部的Info数组
    free(array->info);
    // 再释放结构体本身
    free(array);
}

对应new的销毁函数

extern "C" void destroy(InfoArray* array) {
    if (!array) return;
    // 先delete数组(注意用delete[])
    delete[] array->info;
    // 再delete结构体
    delete array;
}

客户端只需要这样调用:

// 创建
InfoArray* arr = create(10);
// 使用...
// 销毁
destroy(arr);

3. 关键注意事项

  • 所有暴露给C客户端的函数必须加extern "C",否则C编译器会生成C风格的名字修饰,导致C客户端链接失败。
  • 内存分配失败时要做错误处理,避免内存泄漏(比如分配数组失败时,要先释放已分配的结构体)。
  • 头文件中要声明create和destroy函数,确保客户端能看到函数原型:
    #ifndef INFO_API_H
    #define INFO_API_H
    
    typedef struct Info {
      int latest;
      int prev;
      int cur;
    } Info;
    
    typedef struct InfoArray {
      Info *info;
    } InfoArray;
    
    // 声明API函数
    InfoArray* create(size_t size);
    void destroy(InfoArray* array);
    
    #endif
    

内容的提问来源于stack exchange,提问作者Xershy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:20:28