なぜ私のヒープが壊れた?
-
25-09-2019 - |
質問
もしかしたらエラー-ヒープ破損で行うのではないでしょうか。
私のベース:
h:
class Base
{
public :
Base(char* baseName, char* cityName);
virtual ~Base();
list<Vehicle*>::const_iterator GetEndList();
void PrintAllVehicles(ofstream &ResultFile) const;
char* GetBaseName() const;
char* GetLocation() const;
void InsertNewVehicleToBase(Vehicle* newVehicle);
list<Vehicle*>::const_iterator FindVehicle(char* id);
void RemoveVehicle (list<Vehicle*>::const_iterator beg);
private:
char* m_name;
char* m_location;
list<Vehicle*> m_baseVehicles;
};
cpp:
Base::Base(char* baseName, char* cityName)
{
m_name = new char [strlen(baseName)+1];
strcpy(m_name, baseName);
m_location = new char [strlen(cityName)+1];
strcpy(m_location, cityName);
}
Base::~Base()
{
delete [] m_name;
delete [] m_location;
//m_baseVehicles.clear();
}
陸軍のデストラクタは:
Army::~Army()
{
list<Base*>::iterator baseIter = m_basesList.begin();
for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
delete (*baseIter);
m_basesList.clear();
}
なぜですか?
解決
そこのあなたが示されたコードとは明らかに間違っている何が、あなたは示していない。
私にはほとんどすぐに不審なものはBase
クラスは二つのポインタを所有し、コピーコンストラクタや代入演算子が定義されていないということです。あなたはBase
オブジェクトをコピーする必要があります。この手段は、あなたが同じデータを指しているオブジェクト2 Base
で終わるだろう、と彼らは破壊するとき、彼らは、ヒープの破損を引き起こし、二度それを削除します。
Army
ポインタを所有しているので) Base
クラスも同様にこの問題を持っているかもしれないが、それはそれはコピーコンストラクタと代入演算子を持っているかどうかは明らかではありませんので、あなたは、クラスの定義を示していません。
Base
オブジェクトが割り当てられている。ここで、は最後に、あなたは示していません。それは彼らがArmy
オブジェクトに渡され、またArmy
対象外のどこかで削除されることは可能ですか?それともBase*
オブジェクトに含まArmy
は削除すべきではないスタック上のオブジェクトを参照している?
他のヒント
目に見える問題をこのコード:
- 利用char*はstd::stringが必要でマニュアルメモリ管理
- の利用 原料のポインタはSTL容器 overcomplicatesの清掃活動コード
- 利用のブラウン管のための文字列操作 C++のコード香'
何も間違っています。 しかし、この種のコードで、をみとめ削除の高いpossiblityがあり、私は二回、メモリブロックdeletin意味をどのヒープの破損につながります。
あなたは、問題を抱えているコードの一部を投稿しませんでした。しかし、それまでにconst - 正しさの問題の多くを持ってます:
Base(char* baseName, char* cityName);
、それらが修飾されていない限り、文字列はconst char*
として渡す必要があります。
virtual ~Base();
これはvirtual
にする必要がある場合は考え。そのサブクラスが何であるかを見ることができません。
list<Vehicle*>::const_iterator GetEndList();
それはconst_iterator
なので、constのメソッドである必要があります。list<Vehicle*>::const_iterator GetEndList() const;
char* GetBaseName() const;
char* GetLocation() const;
あなたのコードが変更されている名前と場所を処理するように設定されていないため、これらは、const char*
を返す必要があります。
list<Vehicle*>::const_iterator FindVehicle(char* id);
list<Vehicle*>::const_iterator FindVehicle(char* id) const;
ここでも、constの方法であるべきです
Base::~Base()
{
delete [] m_name;
delete [] m_location;
//m_baseVehicles.clear();
}
それは右のデストラクタの後、とにかく起こるため、あなたはm_baseVehicles.clear();
は必要ありません。彼らは他の場所で参照されていない、またはあなたがリークを取得します場合は、あなたが車を削除する必要があります。
軍のデストラクタます:
"デストラクタ"。そして、どこArmy
の残りの部分ですか?
Army::~Army()
{
list<Base*>::iterator baseIter = m_basesList.begin();
for (baseIter ; baseIter != m_basesList.end() ; ++baseIter)
delete (*baseIter);
m_basesList.clear();
}
ここでも、あなたは必要ありませんm_basesList.clear();
ます。
私は何の問題が表示されません。マット・ケインが言ったのと同じように、どのようにそれが読み込まれますでしょうか?
ヒープ破損セルに割り当てられたメモリより割り当てられたヒープセルに複数のデータをコピーすることから来ます。ヒープ細胞の始まりと終わりが上書きされたが、ヒープの破損として報告される場合よりもデータが含まれています。
あなたはすべてのコードを投稿していないと私はあなたが投稿したコードに問題を参照することはできませんが、私はあなたが問題を診断するためにValgrindのようなメモリツールを使用して助言する。