C++ C++;-指针的重新分配指针上的空闲崩溃

C++ C++;-指针的重新分配指针上的空闲崩溃,c++,pointers,C++,Pointers,这是我第一次来这里,我对编码很陌生。 我想做一个矩阵类 //Matrix.hpp #ifndef __MATRIX_H__ #define __MATRIX_H__ class Matrix{ private: unsigned int m_row, m_column; unsigned int** matrix; public: Matrix(unsigned int row, unsigned int column); ~Matrix(); voi

这是我第一次来这里,我对编码很陌生。 我想做一个矩阵类

//Matrix.hpp
#ifndef __MATRIX_H__
#define __MATRIX_H__
class Matrix{
private:
    unsigned int m_row, m_column;
    unsigned int** matrix;

public:
    Matrix(unsigned int row, unsigned int column);
    ~Matrix();

    void transposeMatrix();

    void fill(unsigned int x);
    void fill_x(unsigned int row, unsigned int column, unsigned int x);
    void setMatrix(unsigned int** mat);

    bool isValid(unsigned int row, unsigned int column);

    unsigned int getRowNum();
    unsigned int getColumnNum();
    unsigned int get_x(unsigned int row, unsigned int column);
    unsigned int** getMatrix();

};
#endif
在Matrix.cpp文件中:

#include <cstdlib>
#include <cstdbool>
#include "Matrix.hpp"

bool Matrix::fail = false;

Matrix::Matrix(unsigned int row, unsigned int column){
    m_row=row;
    m_column=column;

    matrix = new unsigned int*[row];
    for(int i=0; i<row; i++){
        matrix[i]=new unsigned int[column];
        for(int j=0; j<column; j++){
            matrix[i][j]=0;
        }
    }
}

Matrix::~Matrix(){
    for(int i=0; i < m_row; i++){
        free(matrix[i]);
        matrix[i]=NULL;
    }
    free(matrix);
    matrix=NULL;
}

void Matrix::transposeMatrix(){
    Matrix tmp_matrix(m_column, m_row);
    for(int i=0; i < m_row; i++){
        for(int j=0; j< m_column; j++){
            tmp_matrix.fill_x(j, i, this->get_x(i, j));
        }
    }

    this->setMatrix(tmp_matrix.getMatrix());
    unsigned int tmp = m_row;
    m_row = m_column;
    m_column = tmp;
}

void Matrix::setMatrix(unsigned int** mat){
    for(int i=0; i < m_row; i++){
        free(matrix[i]);
        matrix[i]=NULL;
    }
    free(matrix);
    matrix=NULL;
    matrix=mat;
}

unsigned int** Matrix::getMatrix(){
    return matrix;
}

void Matrix::fill(unsigned int x){
    for(int i=0; i<m_row; i++){
        for(int j=0; j<m_column; j++){
            matrix[i][j]=x;
        }
    }
}

void Matrix::fill_x(unsigned int row, unsigned int column, unsigned int x){
    if(row>= m_row||column>=m_column) return;
    matrix[row][column]=x;
}

bool Matrix::isMatch(unsigned int x, unsigned int y){
    if (x==y) return true;
    return false;
}

bool Matrix::isValid(unsigned int row, unsigned int column){
    if(row<m_row&&column<m_column) return true;
    return false;
}

unsigned int Matrix::get_x(unsigned int row, unsigned int column){
    if(isValid(row, column)) return matrix[row][column];
    throw "Invalid matrix index exception.";
}

unsigned int Matrix::getRowNum(){
    return m_row;
}

unsigned int Matrix::getColumnNum(){
    return m_column;
}
输出是

[some random number] 0
[some random number] 0
30 30

问题在于,当转置函数结束时,析构函数在tmp_矩阵上被调用,从而删除了它的矩阵指针,它也被实矩阵容器指向


已经修好了。谢谢大家。尽管被否决有点令人沮丧。但也许这真的是一个愚蠢的问题。

您可以为已分配的内存地址分配一个指针,然后释放它。您可以使用同一个指针,分配一个已分配的不同内存地址并释放该地址。您应该执行“if(ptr!=0){free()…}”,如果使用new[]进行分配,则应该使用delete[]
[some random number] 0
[some random number] 0
30 30