私は行列オブジェクトのコンストラクタを構築しました。データは構造体val
の配列に格納され、配列の位置と値が保持されます。これはコードです:コンストラクタの不明瞭なセグメント化エラー
SparseMatrix::SparseMatrix(const int numRow, const int numCol, vector<double> fill):
Matrix(numRow,numCol)
{
_matrix = new vector<val*>(fill.size());
vector<double>::iterator itr = fill.begin();
for(signed int i=0; i<numRow; i++)
{
for(signed int j=0; j<numCol; j++, itr++)
{
if (*itr == 0)
{
continue;
}
val *temp = new val;
temp->value = *itr;
temp->x = i;
temp->y = j;
_matrix->push_back(temp);
cout << "Psition: " << ": " << _matrix->front()->x << //<--ERROR
cout << " " << _matrix->back()->y << endl;
}
}
}
私はpush_backが本当に私のために働いていないことを確認するためにちょうど追加しました。 _matrixはヒープ上にあり、そこに保持されているすべての構造体も同様です。すべては 'new'を使用して作成されます。なぜこれがうまくいかないのか分からない。私がそれを読むことができないベクトルに新しい構造体のポインタをプッシュした後の1行(私が言ったようにセグメンテーションフォールト)。
アイデア?ありがとう!
EDIT: 申し訳ありませんが、これはvalgrindののメッセージです:
==13334== Invalid read of size 4
==13334== at 0x804AEAE: SparseMatrix::SparseMatrix(int, int, std::vector<double, std::allocator<double> >) (in /home/yotamoo/workspace/ex3/main)
==13334== by 0x8048C10: main (in /home/yotamoo/workspace/ex3/main)
==13334== Address 0x8 is not stack'd, malloc'd or (recently) free'd
==13334==
==13334==
==13334== Process terminating with default action of signal 11 (SIGSEGV)
==13334== Access not within mapped region at address 0x8
==13334== at 0x804AEAE: SparseMatrix::SparseMatrix(int, int, std::vector<double, std::allocator<double> >) (in /home/yotamoo/workspace/ex3/main)
==13334== by 0x8048C10: main (in /home/yotamoo/workspace/ex3/main)
==13334== If you believe this happened as a result of a stack
==13334== overflow in your program's main thread (unlikely but
==13334== possible), you can try to increase the size of the
==13334== main thread stack using the --main-stacksize= flag.
==13334== The main thread stack size used in this run was 8388608.
そして - セグメンテーションフォールトは、最初の反復の間に発生!
を何GDBはあなたを教えたのですか? Valgrind?なぜポインタを格納していますか? –