在静态函数中释放内存的最佳方法

时间:2013-12-13 06:19:36

标签: c++ matrix

这是一个现在正在运行的Matrix实现。

我需要释放*数据的内存。

但是readMatrix函数是静态的,所以我无法删除readMatrix中的数据[]。 在readMatrix返回* m矩阵后,最好的方法是什么。

Matrix.cpp

#include "Matrix.h"
#include <sstream>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;
Matrix::Matrix(int i, int j) {
    rows=i;
    cols=j;
    data = new float [i * j];
}

Matrix::Matrix(const Matrix& m) {
    rows=m.rows;
    cols=m.cols;
    data=m.data;
}

int Matrix::numRows() {
    return rows;
}

int Matrix::numCols() {
    return cols;
}

float *Matrix::access(const int i, const int j) const {
    return &data[(((i * cols) + j) - 1)] ;
}

std::ostream& operator<<(std::ostream &os, Matrix &m) {
    int i, j;
    os << m.numRows() << " " << m.numCols() <<endl;
    for (i = 0; i < m.numRows(); i++) {
        for (j = 0; j < m.numCols(); j++) {
            os << *(m.access(i, j)) << "  ";
        }
        os << endl;
    }

    return os;
}

int **Create2D(int row, int col)
{
    int **p = new int* [row];
    for (int j = 0; j < row; j ++)
        p[j] = new int[col];
    return p;
}
// Deletes an array pointed by 'p' that has 'row' number rows
void Delete2D(int **p, int row)
{
    for (int j = 0; j < row; j ++)
        delete [] p[j];
    delete [] p;
}

Matrix Matrix::readMatrix(std::string filename)
{
    int r ,c;

    ifstream matrixFile(filename.c_str());
    matrixFile >> r >> c;
    int **p = Create2D(r, c);

    Matrix* m = new Matrix(r, c);
    for (int i=0; i<r; i++) {
        for (int j=0; j<c; j++) {
            matrixFile >> p[i][j];
            *(m->access(i,j))= (float)p[i][j];
        }
    }
    matrixFile.close();
    Delete2D(p, r);

    return *m;
}

Matrix.h

#ifndef MATRIX_H
#define MATRIX_H

#include <stdlib.h>
#include <iostream>
#include <fstream>

class Matrix {
public:
    Matrix(int i, int j) ;
    Matrix (const Matrix& m) ;

    int numRows ( ) ;
    int numCols ( ) ;
    float *access(const int i, const int j) const ;
    friend std::ostream& operator<<(std::ostream &os, Matrix &m) ;

    static Matrix readMatrix ( std::string filename ) ;

private:
    Matrix() { }
    // ~Matrix() { }
    int rows ;
    int cols ;

    float *data ;
} ;

#endif // MATRIX_H

谢谢!

1 个答案:

答案 0 :(得分:0)

这里

Matrix::Matrix(const Matrix& m) {
    rows=m.rows;
    cols=m.cols;
    data=m.data;
}

对于你的裸浮点指针不会很好(注意它应该是float**),你最终有更多的实例指向相同的数据,当它们超出范围时,它们将删除相同的数据数据不止一次导致UB。

复制构造函数中需要做的是克隆数据。由于你有行/列,它应该相当容易。

现在问你的问题。

这里

...
matrixFile >> p[i][j];
*(m->access(i,j))= (float)p[i][j];
...

(注意你在末尾声明了访问const(float * access(const int i,const int j)const),这意味着上面的赋值是非法的,const后面的方法意味着实例不会受到影响但是你用它来为它分配一个值)

似乎没必要,因为你一次只读一个浮点数,只需要一个浮点变量就可以用来从文件中读取值然后为你的矩阵赋值

...
matrixFile >> floatRead;
*(m->access(i,j))= floatRead;
...

所以放弃整个p矩阵。

替代。读入p矩阵中的值,然后让Matrix实例获得它的所有权。

e.g。

...
m->attachMatrixValues(p);
...