我正在尝试返回一个双精度数组。当我的函数返回它,然后尝试在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。
答案 0 :(得分:2)
退出pi_sequence
函数后,vector<double> ests
被破坏。
由于data()
返回一个指向基础数组的指针,所以它返回到调用者时指向无效的内存,因为该内存是由vector<T>
析构函数释放的。
为什么不按值返回向量本身呢?在任何情况下,都将通过RVO(或移动语义)对其进行优化,因此不会有太大区别。
答案 1 :(得分:1)
您正在返回一个指针,该指针不再存在。由于vector
在函数本地,因此在函数返回时它不再存在。因此,指向向量中对象的指针现在就是指向任何垃圾的指针,如果有的话,恰好存储在向量之前的位置。
考虑一下-您认为要打印什么double
?代码中没有double
。如果您想“ double
中的第一个vector
”,请问自己什么向量。 ests
向量超出范围,如果再次调用pi_sequence
,将会创建一个新向量。