按值返回指针的集合
Returning a collection of pointers by value
我有一个库函数,它创建并(按值)返回一个指向堆上某些对象的指针向量。当我使用c++时,这工作得很好,但现在我需要导出这个函数,以便它可以与c链接,我对如何以干净的方式实现这一点感到困惑。
我的第一个naïve尝试如下:
airport_t **listAiportsByCode(const char *code) {
vector<airport_handle*> airports;
// Fill up vector with pointer to airports on the heap ...
airports.push_back(nullptr);
airport_t** c_airports = airports.data();
return c_airports;
}
显然不起作用,因为机场向量是堆栈分配的。
我是否需要在堆上分配一个数组并简单地记录该数组在使用后需要删除?
airport_t **listAiportsByIATA(const char *iata) {
vector<airport_handle*> airports;
// Fill up vector with airports ...
airports.push_back(nullptr);
airport_t* c_airports = new airport_t*[BUFFER];
std::copy(airports.begin(), airports.end(), c_airports);
return c_airports;
}
我习惯用高级语言编程,对于这样一个微不足道的函数来说,这似乎是一个太丑陋的设计。
对于处理内存,我认为您唯一的选择是分配数组并让客户端整理它或让客户端分配数组。
它也可能是更干净,不使用向量和直接写入数组?
为客户端分配数组:
airport_t **listAiportsByIATA(const char *iata) {
airport_t** c_airports = new airport_t*[BUFFER];
// Fill up vector with airports ...
for (airport_t** airport = c_airports; airport < c_airports + BUFFER; ++airport) {
*airport = nullptr;
}
return c_airports;
}
Client分配array:
void listAiportsByIATA(const char *iata, airport_t ** c_airports, int maxSize) {
// Fill up vector with airports ...
for (airport_t** airport = c_airports; airport < c_airports + maxSize; ++airport) {
*airport = nullptr;
}
}
这是相当丑陋的,但这是C的做事方式。您可以采用您的方法,或者将airport_t**作为参数并让客户端为您分配内存。您只需要填充客户端分配的内存,并返回插入的元素数量。
int listAiportsByIATA(const char *iata, airport_t **c_airports) {
vector<airport_handle*> airports;
// Fill up vector with airports ...
airports.push_back(nullptr);
std::copy(airports.begin(), airports.end(), c_airports);
return airports.size();
}
然而,这个解决方案会有另一个问题,客户端将需要分配足够的内存供您填充。因此,您可能需要添加另一个检查
相关文章:
- 互斥指针的集合
- MPI 集合通信中的指针分配
- 保留计时器集合(对象与指针)的最佳方法
- 如何让集合 in C++过滤掉指向相同值的不同指针
- 集合中的智能指针多态性
- 重载指向集合的指针的开始/结束是否是个好主意
- C++基类指针、集合类
- Boost:当缺少类型时,如何通过基指针序列化/反序列化泛型类型集合
- 使用指针在恒定时间内从集合中删除
- 无法将对象上的指针添加到集合
- 如何保留指向插入到集合中然后推送到向量中的对象的指针
- C++ 创建指向两个相关矢量集合中的对象的指针集合
- 将指向派生类实例的指针集合视为父类
- 管理指向派生对象的指针集合的最佳方式
- 指针集合和添加对象
- C++指针集合类,便于通信
- 将指针传递到集合向量C++/cx
- 更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较
- 当返回一个集合指针时,客户端如何知道它是否需要销毁它?
- 指针的集合.复制构造函数问题