在发布模式下崩溃,而不是在调试模式下崩溃

时间:2016-06-19 20:54:22

标签: c++ windows

我正在Visual Studio Express 2013中编写Windows控制台应用程序。它在调试模式下编译并运行正常,但发行版本崩溃(访问冲突读取位置0xFFFFFFFF )。 stackoverflow上有几个类似的问题,但它们似乎都没有解决我的问题。它们通常与未初始化变量访问超出数组边界的元素指针算术动态分配的内存。我不认为这些适用于此,但我希望被证明是错误的。

我已经大大减少了代码(原始版本在1000到2000行之间),每次删除代码并检查它是否仍然崩溃。我似乎无法使它变小,仍然会出现错误。现在代码如此简单,我对这个bug的位置感到茫然。这可能是标准的C ++错误(我对这种语言很新)。我不想问这样一个普遍的问题,但是:

  

以下代码中的错误在哪里?

我现在几乎所有的东西都会让虫子消失。当我禁用优化时(或者甚至在我优化但禁用内联时)它也会消失。 我唯一的怀疑是它可能与矢量矢量(left_neighbors)有关。

Point.h

#pragma once
class Point {
public:
    double x, y;
    Point(double xcoord, double ycoord);
};

Point.cpp

#include "stdafx.h"
#include "Point.h"

Point::Point(double xcoord, double ycoord) {
    x = xcoord;
    y = ycoord;
}

Diagram.h

#pragma once
#include "Point.h"
#include <vector>

class Diagram
{
public:
    void check_for_crossing();
    std::vector<Point> vertices;
    std::vector<std::vector<size_t>> left_neighbors;
};

Diagram.cpp

#include "stdafx.h"
#include "Diagram.h"

double y_coordinate_of_segment_at(const Point start, const Point end, const double x) {
    return (start.y + (x - start.x) / (end.x - start.x) * (end.y - start.y));
}

void Diagram::check_for_crossing() {
    Point end1 = Point(1.5, 0.2);
    Point end2 = Point(2.8, 3.4);

    double y1_at_min = y_coordinate_of_segment_at(Point(0.5, 0.5), end1, 0.5);
    double y2_at_min = y_coordinate_of_segment_at(Point(1.5, 0.2), end2, 0.5);

    Point intersection(0.0, 0.0);
    intersection.x = (y2_at_min - y1_at_min) / (y2_at_min); // y2_at_min is not 0
    intersection.y = y_coordinate_of_segment_at(Point(0.5, 0.5), end1, intersection.x);
    vertices.push_back(intersection);

    left_neighbors.push_back({ 0, 1 });
}

Berlin.cpp (这是主要功能所在的位置)

#include "stdafx.h"
#include <tchar.h>
#include "Point.h"
#include "Diagram.h"

Diagram create_diagram() {
    Diagram diagram;
    diagram.vertices.push_back(Point(2.8, 3.4));
    return diagram;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Diagram diag = create_diagram();
    diag.check_for_crossing();

    return 0;
}

项目中唯一的其他文件是 stdafx.h stdafx.cpp ,它们用于预编译头文件。 stdafx.cpp 的内容仅为 #include“stdafx.h” stdafx.h 为空。

0 个答案:

没有答案