После возврата вектора в виде двойного *, когда он читается, он отличается - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь вернуть массив значений типа double.Когда моя функция возвращает его, и затем я пытаюсь прочитать из него в 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 после возвращения, и почему оно не остается.

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы возвращаете указатель на то, что больше не существует. Поскольку vector является локальным для функции, он больше не существует, когда функция возвращается. Таким образом, указатель на объекты, которые были в векторе, теперь является указателем на любой мусор, если вообще что-то хранится там, где вектор был раньше.

Подумайте об этом - что, double вы думаете, вы печатаете? На данный момент в коде нет double s. Если вы думаете «первый double в vector», спросите себя что такое вектор. Вектор ests находится вне области видимости, и если вы снова вызовете pi_sequence, будет создан новый.

0 голосов
/ 17 января 2019

При выходе из функции pi_sequence, vector<double> ests уничтожается.

Поскольку data() возвращает указатель на базовый массив, он указывает на недопустимую память при возврате вызывающей стороне, так как эта память освобождается деструктором vector<T>.

Почему бы вам просто не вернуть сам вектор по значению? В любом случае он будет оптимизирован с помощью RVO (или семантики перемещения), поэтому разницы не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...