いつもすみません。データ構造のスタックを実際にプログラムしてみようということで、クラステンプレート形式でつくってみたのですがデバックを実行し、return 0のとこまで処理が進んだところ、「ヒープが壊れています」と怒られました。
いろいろと検査しグーグル先生に見てみたところ、push()ないで領域を2倍に拡張する際に利用するresize()に問題があるらしいことまではわかったのですが、ダブルdeleteはしていないし、newで確保した領域以外にアクセスしているようなコードも(見落としがあるかもしれませんが)ないですし、途方に暮れています。
コピーする最初の数行ですが、copy宣言時のサイズを10、m_usageTopを5にしたり、m_usageTopの変化を観察したりしてみましたが特に異常はありませんでした。
bool Stack<T>::resize(){
// 今持っている領域の内容を別に移す
T* copy = new T[m_usageTop];
// const unsigned int csize = m_usageTop + 1; // コンストラクタで初期化だとコンパイル時に決定してないので不定
for(unsigned int i = 0; i < m_usageTop; i++){
copy[i] = item[i];
}
// 領域再確保 try{ if(size <= 1) delete item; else delete[] item; item = nullptr; item = new T[2*size]; size = 2 * size; // bad_allocがthrowされるとここは動作しない }catch(std::bad_alloc){ std::cout << "std::bad_alloc" << std::endl; if(item == nullptr) item = new T[size]; else{ delete[] item; item = new T[size]; } if( m_usageTop <= 1) delete copy; else delete[] copy; copy = nullptr; return false; } // 移していた領域を確保先に移す for(unsigned int i = 0; i < size; i++){ if( i < m_usageTop) item[i] = copy[i]; else item[i] = 0; } if( m_usageTop <= 1) delete copy; else delete[] copy; copy = nullptr; return true;
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2014/11/26 12:31