0

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

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

4

2 回答 2

0

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

你可以有很多解决方案:

  • 将向量传递给函数,以便调用者负责其分配和释放
  • 使用动态数组(例如someType *array = new someType[vec.size()],您将负责通过delete[] array
  • 返回向量本身,以便将其推入堆栈并且在退出函数时不会被释放(return vec
于 2013-05-12T01:56:04.383 回答
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;
};
于 2013-05-12T03:48:18.863 回答