【问题标题】:C++ method returning a pointer: segmentation fault [closed]返回指针的 C++ 方法:分段错误 [关闭]
【发布时间】:2014-06-29 17:56:10
【问题描述】:

以下代码给了我一个分段错误,我尝试了很多不同的方法,但无法理解为什么它不起作用。我对 C++ 很陌生,所以如果这个问题可能有点简单,我很抱歉;)这是我的代码:

 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);
 }

【问题讨论】:

  • 您希望intersec 指向哪里?
  • 没有分配给intersec
  • 你试过在调试器中运行它吗?这是理解程序为什么会出现段错误的重要技能。

标签: c++ pointers reference segmentation-fault dereference


【解决方案1】:

你有

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;
}

main完成时,您可以使用std::shared_ptr自动删除对象。

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
   // ...
   // ...
}

【讨论】:

  • 太棒了-谢谢!会尽快接受 :)
  • 至少应该提一下,你需要从使用这个函数的客户端delete这个指针来避免内存泄漏。
  • @πάνταῥεῖ,感谢您的提示。更新了答案。
  • 好的 - 谢谢你们!
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
相关资源
最近更新 更多