我有这个课程,在某个时候我正在计算两个双打的数组:
double* QSweep::computeIntersection(double m1, double b1, double m2, double b2){
double* v=new double[2];
v[0]= (b2-b1)/(m1-m2);
v[1]= (m1*b2-m2*b1)/(m1-m2);
return v;
}
在类的另一个函数中,我使用此数组来处理其值。 根据作为参数传输的值,我获得了两个daoubles的这个数组的几个值。我希望将所有这些值保留在两个双精度数组的数组中。 我已经尝试了一些方法,但我有bur错误,segementation故障或所有问题,因为这。 任何想法都受到欢迎。
提前谢谢你, madalina
答案 0 :(得分:9)
如果它们总是两个值,那么返回std::pair<double, double>
会不会更合乎逻辑(也更有用)?这可能会节省很多痛苦,特别是与显式内存管理相关(因为您使用的是new
/ delete
):
std::pair<double, double> QSweep::computeIntersection(
double m1, double b1, double m2, double b2
) {
return std::make_pair( (b2-b1)/(m1-m2), (m1*b2-m2*b1)/(m1-m2));
}
答案 1 :(得分:2)
您的另一个选择是更改签名:
void QSweep::computeIntersection(double m1, double b1, double m2, double b2, double& return_v0, double& return_v1)
{
return_v0 = (b2-b1)/(m1-m2);
return_v1 = (m1*b2-m2*b1)/(m1-m2);
}
答案 2 :(得分:1)
也许你应该有一个名为Intersection的类型,这个类型很快就完成了:
typedef std::pair<double, double> Intersection
或许在那里应该有更明确的东西,因为对的成员是“第一”和“第二”,也许你可能想要更具描述性的东西。
在任何情况下,您宁愿按值返回这些东西,而不是返回指向堆分配内存的指针。
答案 3 :(得分:1)
您的示例不足以提供有关其崩溃原因的问题的答案。
以下示例将确保未释放的指针没有内存泄漏,并保持类似的结构。
typedef std::pair<double, double> Intersection;
typedef std::vector<Intersection> Plane;
Intersection QSweep::computeIntersection
( double m1
, double b1
, double m2
, double b2)
{
return Intersection( (b2-b1)/(m1-m2), (m1*b2-m2*b1)/(m1-m2));
}
main()
{
Plane plane;
while( input ){
plane.push_back( Intersection( ... ) );
}
}
可能有其他存储方式,例如当你使用double时,你可以使用calloc和realloc来保持一块内存的大小合适。 (到目前为止,不建议给出你的例子)
答案 4 :(得分:0)
使用vector
维护您的双打历史记录。如果你继续使用一系列双打,要抓住它们,做这样的事情:
std::vector<double*> history;
history.push_back(v);
注意,当你完成向量(或单个向量元素)时,你仍然需要delete
每个元素指向的内存。要解决此问题,请使用pair
跟踪原始的双打数组(如果您只使用两个)或vector<double>
。
答案 5 :(得分:0)
鉴于你所拥有的是两个双打的阵列,我不怀疑有必要在某个时候提高这个数字。就像,如果在某些时候你决定添加3d功能。我愿意继续使用阵列。但是没有必要使用动态数组。使用包含在boost::array
之类的结构中的数组:
boost::array<double, 2> QSweep::computeIntersection(
double m1, double b1, double m2, double b2
) {
boost::array<double, 2> array = { (b2-b1)/(m1-m2), (m1*b2-m2*b1)/(m1-m2) };
return array;
}
然后您可以将其添加到包含以下内容的向量中:
typedef std::vector< boost::array<double, 2> > vec_of_2darray_t;
vec_of_2darray_t v;
v.push_back(computeIntersection(a, b, c, d));
// ...
如果你的目标是简单性和可扩展性,这可能是你能得到的最好的结果。boost::array
是一个非常小而简单的结构。它基本上等于
template<typename T, size_t N>
struct array { T data[N]; };
当然,有几个功能,如operator[]
,begin()
和end()
以及其他功能。但是没有构造函数,所以你可以像上面那样将它初始化为普通数组。
答案 6 :(得分:0)
谢谢:), 它与push_back一起使用每次在
类型的新向量中获得的值vector <double *>,
madalina