简体   繁体   English

了解C ++类中的std :: bad_alloc

[英]understanding std::bad_alloc in C++ class

I am trying to understand the C++ classes by making a class for matrice operations. 我试图通过为矩阵运算创建一个类来理解C ++类。 I have discovered an dumps error! 我发现了转储错误! I am having received the following literature from the compiler: 我从编译器收到以下文献:

terminate called after throwing an instance of 'std:bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

Here is my programming: 这是我的程序:

#include <stdio.h>
#include <cmath>
#include <iostream>
using namespace std;

void swap(double &a, double &b)
{
    double temp = a;
    a = b;
    b = temp;
}

class matric
{
public:
    int row;
    double *pData = new double[row *row];
    void input();
    void output();

    int InverseMatrix(matric m1);

    int det(matric m1);

    void multiply(matric m1, matric m2);

};
void matric::input()
{
    int i, j;
    cout << "enter the size of matrix:";
    cin >> row;
    cout << "enter the matrix:" << endl;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < row; j++)
        {
            cin >> pData[i * row + j];
        }
    }
}
void matric::output()
{
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < row; j++)
        {
            cout << pData[i * row + j] << "  ";
        }
        cout << endl;
    }
}
void matric::multiply(matric m1, matric m2)
{
    int j1 = 0, k1 = 0, j2 = 0, k2 = 0;

    for (j1 = 0; j1 < row; j1++)
    {
        for (k2 = 0; k2 < row; k2++)
        {
            *(pData + j1 * row + k2) = 0;
            for (k1 = 0; k1 < row; k1++)
            {
                *(pData + j1 * row + k2) += *(m1.pData + j1 * row + k1) * (*(m2.pData + j2 * row + k2));
                j2++;
            }
            j2 = 0;
        }
    }


}


int matric::InverseMatrix(matric m1)
{
    double *m = new double[row * row];
    double *ptemp, *pt = m;

    int i, j;

    ptemp = pData;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < row; j++)
        {
            *pt = *ptemp;
            ptemp++;
            pt++;
        }
    }

    int k;

    int *is = new int[row], *js = new int[row];

    for (k = 0; k < row; k++)
    {
        double max = 0;
        for (i = k; i < row; i++)
        {
            for (j = k; j < row; j++)
            {
                if (fabs(*(m + i * row + j)) > max)
                {
                    max = *(m + i * row + j);
                    is[k] = i;
                    js[k] = j;
                }
            }
        }

        if (0 == max)
        {
            return 1;
        }

        if (is[k] != k)
        {
            for (i = 0; i < row; i++)
            {
                swap(*(m + k * row + i), *(m + is[k]*row + i));
            }
        }

        if (js[k] != k)
        {
            for (i = 0; i < row; i++)
            {
                swap(*(m + i * row + k), *(m + i * row + js[k]));
            }
        }

        *(m + k * row + k) = 1 / (*(m + k * row + k));

        for (j = 0; j < row; j++)
        {
            if (j != k)
            {
                *(m + k * row + j) *= *((m + k * row + k));
            }
        }

        for (i = 0; i < row; i++)
        {
            if (i != k)
            {
                for (j = 0; j < row; j++)
                {
                    if (j != k)
                    {
                        *(m + i * row + j) -= *(m + i * row + k) **(m + k * row + j);
                    }
                }
            }
        }

        for (i = 0; i < row; i++)
        {
            if (i != k)
            {
                *(m + i * row + k) *= -(*(m + k * row + k));
            }
        }
    }

    int r;
    for (r = row - 1; r >= 0; r--)
    {
        if (js[r] != r)
        {
            for (j = 0; j < row; j++)
            {
                swap(*(m + r * row + j), *(m + js[r]*row + j));
            }
        }
        if (is[r] != r)
        {
            for (i = 0; i < row; i++)
            {
                swap(*(m + i * row + r), *(m + i * row + is[r]));
            }
        }
    }

    ptemp = pData;
    pt = m;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < row; j++)
        {
            *ptemp = *pt;
            ptemp++;
            pt++;
        }
    }
    delete []is;
    delete []js;
    delete []m;

    return 0;
}

int main()
{
    matric m1;
    m1.input();
    m1.output();

    matric m2;
    m2.input();
    m2.output();
    cout << "creating m3" << endl;
    matric m3;
    m3.input();
    m3.multiply(m1, m2);
    m3.output();

    matric m4;
    m4.InverseMatrix(m1);
    m4.output();

    return 0;
}

At first remove initialization in you class. 首先,请删除类中的初始化。

double *pData = new double[row *row];

make it just this 做到这一点

double *pData;

Then create a proper constructor for your class, that will initialize variable row with 0 and pData with NULL . 然后为您的类创建一个适当的构造函数,该构造函数将使用0初始化变量row和使用NULL初始化pData If you need it, create a constructor that will retrive size of your matrix like this 如果需要,请创建一个构造函数,该构造函数将检索矩阵的大小,如下所示

matric(int newSize) {
   // allocate memoty here
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM