サイズを動的に再割り当てする行列クラスがあります。具体的には、行の配列を動的に再割り当てします。
ただし、場合によっては、マトリックスのデストラクタが呼び出されたときにメモリ解放の問題が発生します。
***glibcが検出されました***./solver:free():invalid next size(fast):0x0000000000c112b0 ***
プロセスは中止されています。
Matrixクラス:
#ifndef __matrix_hpp
#define __matrix_hpp
#include <cstring>
#include <stdexcept>
#include "row.hpp"
using namespace std;
class Matrix {
public:
Matrix();
~Matrix();
size_t size();
void resize(size_t size);
double get(size_t x, size_t y) throw (out_of_range);
void set(size_t x, size_t y, double value) throw (out_of_range);
double getfv(size_t y) throw (out_of_range);
void setfv(size_t y, double value) throw (out_of_range);
void optimize(size_t y) throw (out_of_range);
void _print();
private:
size_t sz;
Row **data;
};
#endif
そして重要な機能の本体:
Matrix::~Matrix() {
if (data != NULL) {
for (size_t i = 0; i < sz; ++i)
delete data[i];
delete [] data;
}
}
void Matrix::resize(size_t size) {
if (size == sz)
return;
Row **newData = new Row *[size];
if (data != NULL)
memcpy(newData, data, sz * sizeof(Row*));
if (size > sz) {
for (size_t i = sz; i < size; ++i)
newData[i] = new Row();
}
else {
for (size_t i = size; i < sz; ++i)
delete data[i];
}
delete [] data;
data = newData;
sz = size;
}
これがコードです。問題は、行列を作成し、後でそのサイズを縮小してdesctructorを呼び出すときに発生します。例えば:
Matrix *matrix = new Matrix();
matrix->resize(10);
matrix->resize(7);
delete matrix;
しかし、マトリックスを大きくすると、かなりうまくいきます。
Matrix *matrix = new Matrix();
matrix->resize(10);
matrix->resize(13);
delete matrix;
そして、最もおかしなことに、この例は機能します。
Matrix *matrix = new Matrix();
matrix->resize(3);
matrix->resize(2);
delete matrix;
だから私は何が間違っているのか分かりません。助言がありますか?