将向量返回为double *后,在读取时,它是不同的

时间:2019-01-17 00:16:41

标签: c++11

我正在尝试返回一个双精度数组。当我的函数返回它,然后尝试在int main中读取它时,它告诉我值是0。

我们在下面的屏幕截图中看到了这一点。

我的最小可验证示例是:

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;

double* pi_sequence(const int& len)
{
  vector<double> ests(len);
  double first = 3.123;
  ests[0] = first;
  cout << "first " << first << " ests.at:" << ests.at(0) << endl;
  return ests.data();
}

int main() {
  double* ests = pi_sequence(1);
  std::cout << "after returned: " << ests[0]  << std::endl;
}

您能帮我理解为什么返回后为0,为什么不保持为0。

enter image description here

2 个答案:

答案 0 :(得分:2)

退出pi_sequence函数后,vector<double> ests被破坏。

由于data()返回一个指向基础数组的指针,所以它返回到调用者时指向无效的内存,因为该内存是由vector<T>析构函数释放的。

为什么不按值返回向量本身呢?在任何情况下,都将通过RVO(或移动语义)对其进行优化,因此不会有太大区别。

答案 1 :(得分:1)

您正在返回一个指针,该指针不再存在。由于vector在函数本地,因此在函数返回时它不再存在。因此,指向向量中对象的指针现在就是指向任何垃圾的指针,如果有的话,恰好存储在向量之前的位置。

考虑一下-您认为要打印什么double?代码中没有double。如果您想“ double中的第一个vector”,请问自己什么向量。 ests向量超出范围,如果再次调用pi_sequence,将会创建一个新向量。