2017-12-14 6 views
1

私はclassを持っています。これは基本的に別のオブジェクトへのポインタの2D matrixのラッパーです。vectorsです。私classのデストラクタが呼び出されるたびに、いくつかの理由 ポインタのベクトル行列を持つオブジェクトのデストラクタを呼び出すときにプログラムがクラッシュする

は、プログラムがクラッシュし、彼らがクラッシュの原因となる、 nullptrをしている場合でも、 deleteポインタにしようとしているように思えます。

のcppファイル:

RotationSolution.h

#ifndef PUZZLESOLVER_ROTATIONSOLUTION_H 
#define PUZZLESOLVER_ROTATIONSOLUTION_H 

#include <vector> 
#include <fstream> 
#include "PuzzlePiece.h" 

using namespace std; 

class RotationSolution { 
private: 
    int _height, _width; 
    vector<vector<PuzzlePiece*>> _matrix; 

public: 
    RotationSolution(); 

    RotationSolution(int height, int width); 

    vector<PuzzlePiece*>& operator[](int row); 

    int get_height() const; 

    int get_width() const; 
}; 


#endif //PUZZLESOLVER_ROTATIONSOLUTION_H 

RotationSolution.cpp:

#include "RotationSolution.h" 

vector<PuzzlePiece*>& RotationSolution::operator[](int row) { 
    return _matrix[row]; 
} 

RotationSolution::RotationSolution() : RotationSolution(0, 0) {} 

RotationSolution::RotationSolution(int height, int width) : 
    _height(height), _width(width), _matrix(vector<vector<PuzzlePiece*>>(_height, vector<PuzzlePiece*>(_width, nullptr))) 
{} 

int RotationSolution::get_height() const { 
    return _height; 
} 

int RotationSolution::get_width() const { 
    return _width; 
} 
ここ

は私.h.cppファイルです0

コードは、実際にこのようなセクションにクラッシュさ:_sol = RotationSolution(height, length);ラインにおける第2の反復において

for (auto length: _rowLengths) { 
     auto height = size/length; 
     _sol = RotationSolution(height, length); 

     ... 
    } 

​​

私は任意のnoobのミスを許してくださいc++に新しいまだ午前:

デバッグ、コードがクラッシュ信号が(LIBファイルをしている私はかなり確信している)new_allocator.hからである送信します悪い習慣:)

+0

なぜdownvoteですか?不足しているものがあるかどうか教えてください –

+0

すべてのコードを貼り付けていませんでしたか?あなたはデストラクタを持っていません。どのようにそこにクラッシュすることができますか? – nvoigt

+2

[mcve]を投稿してください。 – nvoigt

答えて

0

RotationSolutionクラスの設計上の欠陥がある - それは生のポインタを格納し、それが_matrix内部に格納されたオブジェクトのクローンを作成します適切に定義されたassigment演算子をミスメンバ変数_matrixが含まれています。 Default generated copy assigment operatorは、メモリを二重に解放し、クラッシュする可能性のあるポインタをコピーします(hereは何が起こっているのか、理由は何か)。使用しようとする「ベクター<ベクトル<のstd :: shared_ptrの< PuzzlePiece>>> _matrix」それは間違ったメモリ管理と問題のほとんどを解決する必要があります(また、「メモリ」の#includeを行います)。スマートポインタについてはtutorialです。

+0

私の問題のような音。私は 'operator ='を呼び出しスタックで行います。それでも問題を解決する方法はまだ分かりませんが、これは問題のようです。ありがとう! –

+0

申し訳ありませんが、私のコメントのテキストで何とか混乱してしまった。 PuzzlePiece *の代わりにstd :: shared_ptr 型をベクタテンプレート宣言の中で使用しようとすると、assigmentsの問題を解決するのに役立ちます。 PuzzlePieceオブジェクトをインストールするにはstd :: make_shared (...コンストラクタパラメータはここに...) –

関連する問題