程序编译但偶尔崩溃引用原因255(CodeBlocks)

时间:2017-06-11 04:46:11

标签: c++ arrays codeblocks

你好:)我是一个非常新的程序员,无法弄清楚为什么我有这个错误。解释一下,当我在行

中运行不同值的程序(下面的代码)时
array2D *a = new array2D(320,240);

(例如,将320和240更改为32和24)程序在执行getSize函数之后或执行prtValue函数(更常见的是前者)之后崩溃。但是,当我构建代码时,无论我在上面的行中有什么值,它都会返回0错误和0警告。

我已经在cpp.sh上测试了代码,该网站每次都会准确地更改值并输出正确/完整的结果,所以我想知道这是否是CodeBlocks /我的硬件问题?调试器也只返回一个问题,它似乎与setValue函数有关,但是我未经训练的眼睛不能说出错误。

为无知而道歉。再说一次,我几乎没有这个领域的经验,而且有些不知所措。提前感谢您提供的任何帮助。

#include <iostream>
using namespace std;

class array2D
{
protected:
    int xRes;
    int yRes;
    float ** xtable;
public:
    array2D (int xResolution, int yResolution); 
    void getSize(int &xResolution, int &yResolution);
    void setValue(int x,int y,float val);
    float getValue(int x,int y);
    ~array2D();
};

array2D::array2D(int xResolution, int yResolution)
{
    xRes=xResolution;
    yRes=yResolution;

    xtable = new float*[xResolution];

    for(int i=0;i < xResolution;i++)
    {
        xtable[i] = new float[yResolution];
    }

    for(int i=0;i < xRes;i++)
    {
        for(int j=0;j < yRes;j++)
        {
            xtable[i][j]=0;
        }
    }
}

void array2D::getSize(int &xResolution, int &yResolution)
{
    xResolution=xRes;
    yResolution=yRes;
    cout << "Size of Array (rows, columns): " << xResolution << ", " << yResolution << endl;
}

void array2D::setValue(int x,int y,float val)
{
    xtable[x][y] = val;
}

float array2D::getValue(int x,int y)
{
    return xtable[x][y];
}

array2D::~array2D(){
    cout << "Destructing array" << endl;
}

int main()
{
    array2D *a = new array2D(32,24);
    int xRes, yRes;
    a->getSize(xRes,yRes);
    for(int i=0;i < yRes;i++)
    {
        for(int j=0;j < xRes;j++)
        {
            a->setValue(i,j,100.0);
        }
    }

    for(int j=0;j < xRes;j++)
    {
        for(int i=0;i < yRes;i++)
        {
            cout << a->getValue(i,j) << " ";
        }
        cout << endl;
    }

    a->~array2D();
}

1 个答案:

答案 0 :(得分:2)

您在以下块中错误地使用了xResyRes

for(int i=0;i < yRes;i++)
{
    for(int j=0;j < xRes;j++)
    {
        a->setValue(i,j,100.0);
    }
}

因此,当xResyRes不同时,您最终会访问不应访问的内存。这会导致未定义的行为。

交换它们。使用:

for(int i=0;i < xRes;i++)
{
    for(int j=0;j < yRes;j++)
    {
        a->setValue(i,j,100.0);
    }
}