在函数调用结束后保持数组的内容。 (C ++)

时间:2009-08-03 01:41:57

标签: c++ arrays memory

假设我有以下代码。

double *return_array(void) {
   double foo[2];
   foo[0] = 5;
   foo[1] = 6;
   cout << foo << endl;
   cout << foo[0] << endl << foo[1] << endl;
   return foo;
}

double *bar = return_array()
cout << bar << endl;
cout << bar[0] << endl << bar[1] << endl;

现在,bar和foo仍然是同一个指针,但那里的内容已经完全改变了。我怎么能绕过这个?基本上,我需要从一个函数传递6或9个双打。我该怎么办?

6 个答案:

答案 0 :(得分:5)

使用矢量。

std::vector<double> return_array(void) {
   std::vector<double> foo;
   foo.push_back(5);
   foo.push_back(6);
   cout << foo[0] << endl << foo[1] << endl;
   return foo;
}

这是一种更好的方法,所以你避免复制矢量:

void fillVector(std::vector<double>& vec)
{
    vec.push_back(5);
    vec.push_back(6);
}

int main()
{
    std::vector<double> vec;

    fillVector(vec);
}

  

现在,bar和foo仍然是一样的   指针,但有什么变化   完全。

因为在函数的堆栈上分配了foo,所以当函数返回时它会被释放。所以,bar实际上并没有指向哪里!

答案 1 :(得分:4)

通常,您会将预先分配的内存传入函数:

int barsize = 2;
double *bar = new double[barsize];
fill_array( bar, barsize );
cout << bar << endl;
cout << bar[0] << endl << bar[1] << endl;
delete [] bar;

void fill_array( double *foo, int foosize )
{
  if ( foosize < 2 )
    return;

  foo[0] = 5;
  foo[1] = 6;
  cout << foo << endl;
  cout << foo[0] << endl << foo[1] << endl;
}

我使用的规则是......总是在同一地点分配和删除内存。

或者使用std :: vector。他们很好=)我再也不会使用数组了。

答案 2 :(得分:1)

使用new关键字在堆上而不是堆栈中分配内存:

double *return_array(void) {
    double * foo = new double [2];
    foo[0] = 5;
    foo[1] = 6;
    return foo;
}

然后调用该函数的代码最终必须在使用delete完成内存时释放内存:

double * foo = return_array();
// ...
delete [] foo;

答案 3 :(得分:1)

使用new分配没有作用域范围的内存。

完成后,不要忘记delete[]记忆。

答案 4 :(得分:0)

您可以在堆上分配结果,或者更好的是,使用std :: vector。

答案 5 :(得分:0)

如果您总是返回固定数量的元素并且愿意使用TR1扩展(或Boost),那么我会使用std::tr1::tuple而不是vector或数组。它是一个模板类,因此您需要按以下方式键入它:

typedef std::tr1::tuple<double, double, double, double, double, double> six_tuple;

使用make_tuple()和相应数量(和类型)的参数来创建函数返回的元组,并使用模板get<N>()函数访问其内容,例如:

six_tuple foo = std::tr1::make_tuple(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
std::cout << std::tr1::get<0>(foo) << std::endl; // prints '1.0'

编译器将会对make_tuple()的参数的数量和类型进行内省,如果您尝试分配错误的元组,则会抛出错误。

我更喜欢自己管理记忆,但你的里程可能会有所不同。