如何剥离矢量容器并返回一个数组?

时间:2013-05-12 01:47:34

标签: c++ arrays vector scope

在读取文件时,通过向量分配内存很方便:

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超出范围是否会破坏它包含的数据,如果有什么我可以保留它。

2 个答案:

答案 0 :(得分:0)

是的,根据您的声明方式,然后向量在堆栈上分配,因此当您超出范围时,您返回的引用将变为无效。

你可以有很多解决方案:

  • 将向量传递给函数,以便调用者负责其分配和释放
  • 使用动态数组(例如someType *array = new someType[vec.size()],您将负责通过delete[] array
  • 解除分配
  • 返回向量本身,以便在退出函数(return vec
  • 时将其推入堆栈并且不会被释放

答案 1 :(得分:0)

你不能在一个函数中分配内存,也不能在不需要清理它的情况下丢失内存。

您可以将函数包装到存储向量的类中。然后你就可以返回指针,数据将一直存在。

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;
};