为什么我的程序在调试器中运行正常时崩溃但在VS 2010 C ++中没有调试器运行时崩溃?

时间:2013-12-12 20:18:31

标签: c++ visual-studio-2010 visual-studio visual-studio-debugging

所以我正在为大学课程制作图形程序。老师有一个代码,但她是EXE。 代码有效。如果我在visual studio中并通过调试启动代码,它可以正常工作。程序通过std :: cout向控制台输出指令,然后出现opengl窗口,一切正常。 但是,如果我按ctrl + f5进行运行而不进行调试,则会打印出指令并出现窗口,但窗口的内容只是纯白色。大约一分钟后,程序崩溃,窗口弹出窗口显示对不起程序崩溃或其他类似的事情。

如果我进入项目文件夹并进入调试文件夹并单击.exe,指令将再次打印出来,然后弹出一个“调试断言失败”并将其归咎于矢量索引不在范围。这会因为除了为什么在我通过visual studio以调试模式运行程序时不会发生这种情况?

如果我在visual studio中并将配置从debug更改为release,则会再次打印指令,这次弹出一个错误的内存分配。它指向这行代码:

Model* mutiplyMatrix(Model model,CMatrix matrix)
{
    Model* m=new Model();
    for(unsigned int i=0;i<model.vectorList.size();i++)
    {
        CVector* v=new CVector();
        v->m=matrix*(*(model.vectorList.at(i)->m));
        v->drawBit=model.vectorList.at(i)->drawBit;
        m->addVectorToList(v);
    }
    return m;
}

确切的行是

CVector* v=new CVector();

所以我的问题是我怎么能得到一个我可以给老师的exe。我很好,包括所需的库等。问题是该程序可以工作,但只有当我在Visual Studio中以调试模式执行它时。在任何一个发布模式下使用或没有调试时程序崩溃。

这是visual studio 2010.

1 个答案:

答案 0 :(得分:2)

我听起来非常像你有一个未初始化的变量,你正在使用它并影响循环执行的次数。在调试模式下,该值可能始终设置为低值或0,只是根据在调试器下运行的性质。但是,当没有在调试器下运行时,您可能最终得到一个非常大的值,这反过来会导致上面的迭代运行一段时间,然后在内存不足时崩溃。我会从model.vectorList.size()向后追踪,看看价值来自哪里。我还会在你输入for循环之前添加一个cout行,打印出尺寸是什么。

编辑:

好吧,我仍然认为你的问题与未初始化变量相关的无限内存分配有关,但你的代码中有很多事情阻碍了你

Model* mutiplyMatrix(Model mode,CMatrix matrix)

这会触发Model和CMatrix的副本。如果您的复制构造函数或析构函数设计不当,那将会产生问题,特别是在您大量使用原始指针成员的情况下。考虑以下课程:

class Foo {
  char * data;
  Foo() { 
    data = new char[1024];
  }
  virtual ~Foo() {
    delete[] data;
  }
};

看起来很好吗?我分配内存,然后解除分配。但是如果我有一个功能

会发生什么
void bar(Foo foo) {
  std::cout << "Called bar" << std::endl;
}

如果我用我的一个foo对象调用该函数,我就会破坏内存。 bar()接受一个Foo对象,而不是一个Foo引用,因此我的原始Foo只是在被传递给bar()之前被复制。因为我没有定义复制构造函数,所以调用默认的复制构造函数,这意味着只复制指针值。这意味着当bar()结束时,指针将被我的类上的~Foo()析构函数释放。但后来当我的原始Foo实例离开作用域时,同样的指针将再次被删除。内存损坏和崩溃。

至少应声明你的方法

Model* mutiplyMatrix(Model & mode,CMatrix & matrix)

或者最好

Model* mutiplyMatrix(const Model & mode,const CMatrix & matrix)

更糟糕的是,因为我们可以从下面的源代码推断出Model有一个看起来像这样的成员:

std:list<CVector*> vectorList;

当您传入的模型被复制然后被销毁时,它可能会造成大堆的混乱。

我最大的建议是停止使用这么多该死的指针。