假设我有以下代码。
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个双打。我该怎么办?
答案 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()
的参数的数量和类型进行内省,如果您尝试分配错误的元组,则会抛出错误。
我更喜欢自己管理记忆,但你的里程可能会有所不同。