私のプロジェクトには、次の 2 つのクラスがありますEarleyParser
。
class EarleyParser
{
public:
EarleyParser();
virtual ~EarleyParser();
void initialize( string filePath, bool probabilityParse );
private:
bool probabilityParser;
typedef unordered_map< string, list<Production> > productionHashTable;
productionHashTable earlyHashTable;
};
そしてProduction
クラス:
class Production
{
public:
Production();
Production( float productionProbability, int productionLength, vector< string >* productionContent );
Production( const Production& copy_me );
virtual ~Production();
float getProductionProbability();
int getProductionLength();
vector< string >* getProductionContent();
private:
float productionProbability;
int productionLength;
vector< string >* productionContent;
void setProductionProbability( float productionProbability );
void setProductionLength( int productionLength );
void setProductionContent( vector< string >* productionContent );
};
上記のように、EarlyParser
クラスには であるメンバー要素がありunordered_map
、そのキー要素は文字列で、値はクラスlist
の要素のです。Production
コードは正しく機能し、unordered_map
とlist
が読み込まれますが、 の標準デストラクタ クラスを呼び出すとEarleyParser
、セグメンテーション エラーが発生します。
私が理解しているように、のデフォルトのデストラクタは、EarleyParser
のデフォルトのデストラクタを呼び出すunordered_map
必要がlist
あり、その要素のそれぞれに対してProduction
クラスのデフォルトのデストラクタを呼び出す必要があります。これは次のとおりです。
Production::~Production()
{
if( this->productionContent != NULL )
delete this->productionContent; <- line 44
}
EarleyParser.cpp
Valgrind と GDB を使用したバック トレースでは、デストラクタの 44 行目で正確に指定されているセグメンテーション エラーを解決する方法について、あまり役に立ちませんでした。
デストラクタ クラスを実装する必要がありますか、それともデフォルトのデストラクタで問題ありませんか? セグメンテーション違反の原因について何か考えはありますか?
追加されたコピー コンストラクター
Production::Production( const Production& copy_me )
{
if( this->productionContent != NULL )
this->productionContent = NULL;
this->setProductionProbability( copy_me.productionProbability );
this->setProductionLength( copy_me.productionLength );
this->setProductionContent( copy_me.productionContent );
}