对象数组和崩溃

Array of objects and crash

本文关键字:崩溃 数组 对象      更新时间:2023-10-16

我一直在使用SDL库开发一个程序。一切都是在Linux中完成的,并且运行得很好,当移植到Windows时问题就来了。当我构建和运行程序崩溃(程序停止工作)并关闭时,我首先认为它与SDL有关,但我将错误隔离到一行中,在该行中我只定义了一个二维数组或类的对象。prototipe类在头文件中定义如下:

#ifndef PARTICULA_H
#define PARTICULA_H
class particula {
    public:
    particula();
    particula(const particula& orig);
    virtual ~particula();
    int x,y;
    int vx,vy;
    int tipo;
    int tipo2;
    int peso;
    int empuje;
    bool update;
    bool update_temp;
    int contador;
    int temperatura;
};
#endif

现在,在其.cpp文件中定义的类构造函数

particula::particula() {
    vx = 0; vy = 0; tipo = 0; peso = 0; empuje = 0; 
    update = true; contador = 0; temperatura = 0;
    update_temp = true; tipo2 = 0;
}
particula::particula(const particula& orig) {
}
particula::~particula() {
}

好的,在main()函数中,就在开头,我定义了这个类的一个数组:

particula matriz[400][220];

如果我构建并运行,程序就会崩溃,如果我评论了那一行,程序就不会崩溃。它不可能是其他任何东西,我已经评论了整个main函数来找到它,所以这一行是唯一执行的东西。可能是什么?我做错什么了吗?

我认为你在堆栈上分配了这么大的数组,所以你会崩溃。你在主函数中写了这行,我没有看到新的运算符。所以您为堆栈上的结构分配内存。堆栈无法容纳这么多数据。。。使用new关键字在堆中分配内存,以后不要忘记释放它。阅读这篇文章。

默认情况下,Windows上的最大堆栈空间为1mb,但该数组需要大约4mb。所以你必须在堆上分配它:

particula (*matriz)[220] = new[400][220];

或者:

vector<vector<particula>> matriz;

然后根据需要添加元素。