• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Vectorでヒープエラーが出る)

Vectorでヒープエラーが出る

このQ&Aのポイント
  • プログラム中のループ処理において、ヒープエラーが発生しています。
  • 2回目のループ時に同じポインタを指すバッファが原因です。
  • 問題の解決方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  先ずは、CBuffクラスのデストラクタを以下の様にして、実行してみましょう。 CBuff::~CBuff() { ::printf("[CBuff::~CBuff() call] [delete pointer] %p\n", buff); if (buff != NULL) { delete [] buff; buff = NULL; } }  デストラクタで、同一のポインタが削除されているのが分かります。  理由はコピーコンストラクタが無い事です。コピーなどした覚えは無いと思うかもしれませんが、実は  v.push_back(cb);  の奥深くでは、std::allocator<T>で割り当てたメモリに対して、クラスcbをコピーしています(プレースメントnew)。  結論としては、コピーコンストラクタと代入演算子をしっかり書く、という事です。  コピーコンストラクタ内の取り扱いも色々な方式が有るのですが、簡単なディープコピーにしておきます。  詳しく知りたいのであるならば、それなりに突っ込んだ書籍等をご覧になられる事をお勧めいたします。 //コピーコンストラクタ CBuff::CBuff(const CBuff& rhs) : buff(NULL) { if(!rhs.buff)return; const std::size_t len = ::strlen(rhs.buff) + 1; this->buff = new char[len]; std::copy(rhs.buff, rhs.buff + len, this->buff); } //代入演算子 CBuff& CBuff::operator=(const CBuff& rhs) { if(this != &rhs) { this->~CBuff(); new (this) CBuff(rhs); } return *this; }  しかし、動かすだけなら此れで良いのですが、実際にはCBuffを作成する必要は無いと言えます。  std::stringを使用すれば良い訳です。 #define ARRAYCOUNT(a) (sizeof(a) / sizeof(a[0])) #include<string> int main() { std::vector<std::string> v; const char* arrPsz[] = {"aaaa", "bbbbb", "cccccc"}; for (int i = 0; i < ARRAYCOUNT(arrPsz); i++) { v.push_back(arrPsz[i]); ::printf("%s\n", v.back()); } return 0; }

関連するQ&A