質問

もしかしたらエラー-ヒープ破損で行うのではないでしょうか。

私のベース:

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のようなメモリツールを使用して助言する。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top