按值返回指针的集合

Returning a collection of pointers by value

本文关键字:集合 指针 返回      更新时间:2023-10-16

我有一个库函数,它创建并(按值)返回一个指向堆上某些对象的指针向量。当我使用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();
}
然而,这个解决方案会有另一个问题,客户端将需要分配足够的内存供您填充。因此,您可能需要添加另一个检查