C++ C++;返回指针的方法:分段错误
下面的代码给了我一个分段错误,我尝试了很多不同的方法,但无法理解为什么它不起作用。我对C++很陌生,所以如果这个问题有点简单,我很抱歉。这是我的密码:C++ C++;返回指针的方法:分段错误,c++,pointers,reference,segmentation-fault,dereference,C++,Pointers,Reference,Segmentation Fault,Dereference,下面的代码给了我一个分段错误,我尝试了很多不同的方法,但无法理解为什么它不起作用。我对C++很陌生,所以如果这个问题有点简单,我很抱歉。这是我的密码: class Line2D { public: Point2D punkt; double dx, dy; void set_values(Point2D p, double d1, double d2); Point2D* getIntersectionPoint(Line2D& line2); };
class Line2D
{
public:
Point2D punkt;
double dx, dy;
void set_values(Point2D p, double d1, double d2);
Point2D* getIntersectionPoint(Line2D& line2);
};
void Line2D::set_values(Point2D p, double d1, double d2)
{
punkt = p;
dx = d1;
dy = d2;
}
Point2D* Line2D::getIntersectionPoint(Line2D& line2)
{
double a, b;
Point2D* intersec;
double det = dx*line2.dy - dy*line2.dx;
if(det == 0)
{
return NULL;
}
else
{
double c1 = line2.punkt.k1 - punkt.k1;
double c2 = line2.punkt.k2 - punkt.k2;
a = (line2.dy*c1 - line2.dx*c2)/det;
b = (dx*c2 - dy*c2)/det;
}
intersec->set_values(a,b);
return intersec;
}
int main()
{
//...
Line2D l1;
Line2D l2;
l1.set_values(p3,6,3);
Point2D p11;
p11.set_values(1,6);
l2.set_values(p11,4,0);
Point2D* intersec;
intersec = l1.getIntersectionPoint(l2);
}
你有
Point2D* intersec;
未初始化为指向任何有效对象
为它分配内存,然后使用指针
Point2D* Line2D::getIntersectionPoint(Line2D& line2)
{
double a, b;
// Initialize the pointer to NULL so
// that it will be easy to detect when it
// points to valid object.
Point2D* intersec = NULL;
double det = dx*line2.dy - dy*line2.dx;
if(det == 0)
{
return NULL;
}
else
{
double c1 = line2.punkt.k1 - punkt.k1;
double c2 = line2.punkt.k2 - punkt.k2;
a = (line2.dy*c1 - line2.dx*c2)/det;
b = (dx*c2 - dy*c2)/det;
}
// Allocate memory for a Point2D
intersec = new Point2D;
intersec->set_values(a,b);
return intersec;
}
更新
确保在main
中删除返回的对象
int main()
{
//...
Line2D l1;
Line2D l2;
l1.set_values(p3,6,3);
Point2D p11;
p11.set_values(1,6);
l2.set_values(p11,4,0);
Point2D* intersec;
intersec = l1.getIntersectionPoint(l2);
// Use intersec
// ...
// ...
// Delete intersec before the end of main.
delete intersec;
}
您可以使用std::shared_ptr
在main
完成时自动删除对象
int main()
{
//...
Line2D l1;
Line2D l2;
l1.set_values(p3,6,3);
Point2D p11;
p11.set_values(1,6);
l2.set_values(p11,4,0);
std::shared_ptr<Point2D> intersec = l1.getIntersectionPoint(l2);
// Use intersec
// ...
// ...
}
intmain()
{
//...
Line2D l1;
line2dl2;
l1.设置_值(p3,6,3);
点2dp11;
p11.设置_值(1,6);
l2.设置_值(p11,4,0);
std::shared_ptr intersec=l1.getIntersectionPoint(l2);
//使用中间词
// ...
// ...
}
您希望intersec
指向哪里?没有为intersec
进行分配您是否尝试在调试器中运行此功能?这是理解程序为何会出错的重要技巧。太棒了-谢谢!将尽快接受:)至少应该提到,您需要从使用此函数的客户端删除该指针,以避免内存泄漏。@πάνταῥεῖ, 谢谢你的提示。更新了答案。好的,谢谢你们!