代码之家  ›  专栏  ›  技术社区  ›  physicsmichael

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

  •  1
  • physicsmichael  · 技术社区  · 15 年前

    假设我有以下代码。

    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 回复  |  直到 15 年前
        1
  •  4
  •   Kieveli    15 年前

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

    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
  •  5
  •   Khaled Alshaya    15 年前

    使用向量。

    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 实际上是指不到哪里!

        3
  •  1
  •   Paige Ruten    15 年前

    使用 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;
    
        4
  •  1
  •   Amber    15 年前

    使用 new 分配不在函数范围内的内存。

    别忘了 delete[] 完成后的记忆。

        5
  •  0
  •   Michael Aaron Safyan    15 年前

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

        6
  •  0
  •   Meredith L. Patterson    15 年前

    如果你总是返回固定数量的元素,并且愿意使用tr1扩展(或boost),我会同意 std::tr1::tuple 而不是 vector 或数组。它是一个模板类,因此您需要将其typedef,沿着以下行:

    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'
    

    编译器将反省 MaGuaTube() ,并在尝试分配给错误类型的元组时引发错误。

    我宁愿这样也不必自己管理记忆,但你的里程数可能会有所不同。