gpt4 book ai didi

c++ - 为什么我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下在 VS 2010 C++ 中运行时会崩溃?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:13 32 4
gpt4 key购买 nike

所以我正在为大学类(class)开发一个图形程序。老师有代码,但她有 EXE。该代码有效。如果我在 visual studio 中并开始调试代码,它工作正常。该程序通过 std::cout 将指令打印到控制台,然后出现 opengl 窗口,一切都按预期进行。但是,如果我在不调试的情况下按 ctrl+f5 运行,则会打印出说明并出现窗口,但窗口的内容只是纯白色。大约一分钟后,程序崩溃,窗口弹出一个窗口,对程序崩溃或类似的内容表示抱歉。

如果我进入项目文件夹并进入调试文件夹并单击 .exe,指令将再次打印出来,然后弹出一个提示“Debug assert fail”并将其归咎于 vector 索引不正确范围。这将使 except 为什么当我通过 visual studio 在 Debug模式下运行程序时不会发生这种情况?

如果我在 visual studio 中并将配置从调试更改为发布,则会再次打印说明,这次会弹出一个提示内存分配错误的消息。它指向这行代码:

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。我可以包含所需的库等。问题是该程序有效,但仅当我在 Debug模式下从 visual studio 执行它时才有效。无论是在 Release模式下使用还是在没有调试的情况下,程序都会崩溃。

这是 visual studio 2010。

最佳答案

我听起来很像您正在使用一个未初始化的变量,它会影响循环执行的次数。在 Debug模式下,由于在调试器下运行,该值可能会始终设置为较低的值或 0。然而,当不在调试器下运行时,您可能会得到一个非常大的值,这反过来会导致上面的迭代运行很长时间,然后在内存不足时崩溃。我将从 model.vectorList.size() 向后追踪以查看值的来源。在您进入打印出大小的 for 循环之前,我还会添加一个 cout 行。

编辑:

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

Model* mutiplyMatrix(Model mode,CMatrix matrix)

这会触发模型和 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;

当你传入的模型被复制然后销毁时,它可能会把堆弄得一团糟。

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

关于c++ - 为什么我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下在 VS 2010 C++ 中运行时会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20553381/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com