如果调试没有,则发布失败

时间:2014-12-19 19:00:18

标签: c++

我的代码有问题,它似乎在发布模式下以一种奇怪的方式失败,调试模式工作得很好。 我没有想法和线索。我想知道该怎么办。 所以这是有问题的代码:

    static inline void FindPoint(Line *First,AABB *Second,point *Pt,int direction)
{
    std::vector<point*> pntvec; ... }

当我调用函数FindPoint时,一切都很好,一切都设置得很好。 但是当我到达向量初始化时,第一个指针被重置为与向量相同的地址。 这会导致意外行为。 所以我认为问题在于共性。 Line和vector都使用了点结构。 然而,我无法找到任何不寻常的东西。 这是结构

typedef struct 
{
  double x;
  double y;
}point;

typedef struct 
{
  double incline;
  double y;
  double x;
  double c;
  point start,finish;
}Line;

这里是初始化发送到参数First的数据:

Line *objvec = new Line;

所以任何人都可以说出问题是什么? 提前谢谢

编辑: 更好地了解代码 http://pastebin.com/rki7EdM6

2 个答案:

答案 0 :(得分:2)

对于这些简单类型,你使用的指针比你应该使用的指针更多。指针和动态分配是未定义行为的可能来源。因此,简单的第一步是重构和清理代码,更喜欢堆栈变量和简单类型的pass-by-reference。很可能,未定义的行为将消失,或者更容易发现错误。

[警告:我无法访问pastebin,所以我看不到你的完整代码。首选网站上的简单示例]

例如,您的函数签名应该是这个(我猜测哪个参数是输出)

static inline point FindPoint(const Line &First, const AABB &Second,int direction)

Line *objvec = new Line;

应该只是

Line objvec;

等等。

std::vector<point> pntvec;

可能是最重要的。指针向量是可以的,但如果可能应该避免。关于标准容器的一个好处是当变量超出范围时自动清理。你没有用指针向量得到它,因为向量不知道在每个元素上调用delete。你必须自己做。

答案 1 :(得分:0)

  

&#34;那么问题是什么可以告诉任何人?&#34;

如果出现这种情况,最可能的原因是,您在其他地方的代码中点击了 undefined behavior
我无法从您发布的上下文和代码中再说出来。但是,使用像valgrind这样的工具可能会对您的服务做到这一点。