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
相关产品推荐
相关产品推荐

