我的代码有问题,它似乎在发布模式下以一种奇怪的方式失败,调试模式工作得很好。 我没有想法和线索。我想知道该怎么办。 所以这是有问题的代码:
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
答案 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这样的工具可能会对您的服务做到这一点。