我需要帮助。现在,我试图制作一个Matrix类,但是每次在Visual Studio 2013中运行它时,程序都会冻结。我认为复制构造函数存在一些麻烦。这是完整的代码。 `

class Matrix
{
private:
    int** matrix;
    int X; // Matrix rows
    int Y; // Matrix columns
public:
    // Default Constructor
    Matrix()
    {
        X = 0;
        Y = 0;
        matrix = NULL;
    }
    // Constructor with parameters
    Matrix(int _X, int _Y)
    {
        srand(time(NULL));

        X = _X;
        Y = _Y;
        matrix = new int*[X];

        for (int i = 0; i < X; i++)
                matrix[i] = new int[Y];

        for (int i = 0; i < X; i++)
        {
            for (int j = 0; j < Y; j++)
            {
                matrix[i][j] = rand() % 100;
            }
        }

    }
    // Copy constructor
    Matrix(const Matrix& N)
    {
        X = N.X;
        Y = N.Y;

        matrix = new int*[X];

        for (int i = 0; i < X; i++)
            matrix[i] = new int[Y];

        for (int i = 0; i < X; i++)
        {
            for (int j = 0; j < Y; j++)
            {
                matrix[i][j] = N.matrix[i][j];
            }
        }
    }
    // Destructor
    ~Matrix()
    {
        for (int i = 0; i < X; i++)
            delete[] matrix[X];
    }
    //--------------------------------------
    void ShowMatrixOnScreen()
    {
        for (int i = 0; i < X; i++)
        {
            for (int j = 0; j < Y; j++)
                cout << matrix[i][j] << "   ";

            cout << endl << endl;
        }
    }
};

void main()
{
    Matrix x(4, 2);
    x.ShowMatrixOnScreen();
}

`

函数“ShowMatrixOnScreen”在屏幕上打印矩阵“x”,但控制台冻结。

最佳答案

您的析构函数有以下声明delete[] matrix[X];matrix[X]不存在,因此您正在释放未分配给您的内存,这是未定义的行为。应该改为delete [] matrix[i]!

此外,正如来自莫斯科的Vlad所指出的,建议对所有内存进行delete,因此您还应考虑添加delete [] matrix,以删除使用matrix = new int*[X];分配的一维指针数组

关于c++ - 动态二维数组的复制构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33393435/

10-13 07:05