对象数组和崩溃

时间:2013-02-09 22:28:09

标签: c++ arrays class sdl

我一直在使用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函数来找到它,因此该行是唯一执行的东西。 会是什么呢?我做错了吗?

2 个答案:

答案 0 :(得分:2)

我认为你在堆栈上分配这么大的数组,所以你会崩溃。你在main函数中写了这行,我没有看到new运算符。所以你在堆栈上为你的结构分配内存。 Stack无法容纳如此多的数据...使用new关键字在堆中分配memomy并且不要忘记稍后释放它。 Read this article.

答案 1 :(得分:0)

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

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

或者:

vector<vector<particula>> matriz;

然后根据需要添加元素。