如何剥离vector容器并返回数组

How to strip away vector container and return an array?

本文关键字:返回 数组 vector 何剥离 剥离      更新时间:2023-10-16

当读入文件时,通过vector来分配内存是很方便的:

someType* readCSV() {
    std::vector<someType> vec;
    someType x;
    ...
    while(fscanf(f, parser, &x) != EOF) {
        vec.push_back(x);
        getc(f); // skip comma
    }
    return &vec[0];
}

但我只是想返回一个正常的数组(我与CUDA工作后,其API使用指针)。

所以问题是vec在函数调用结束时是否超出范围会破坏它包含的数据,如果有什么我可以做的,保存它。

在函数中分配内存时,如果事后不清理内存,就不可能不丢失内存。

可以将函数包装到存储vector的类中。然后,您就可以返回指针,并且数据将被保存。

class csvReader
{
public:
  csvReader (void) {}
  type* readCSV (void)
  {
    type x;
    while(fscanf(f, parser, &x) != EOF) {
      vec.push_back(x);
      getc(f); // skip comma
    }
    return vec.data();
  }
private:
  std::vector<type> vec;
};

是的,根据你声明它的方式,那么向量是在堆栈上分配的,因此当超出作用域时,你返回的引用将无效。

你可以有很多解决方案:

  • 向函数传递一个向量,以便调用者负责其分配和释放
  • 使用动态数组(如someType *array = new someType[vec.size()]),您将负责通过delete[] array释放它
  • 返回向量本身,以便在退出函数(return vec)时将其压入堆栈而不释放。