2

次のコードで問題が発生しましたが、何時間も解決できません...どんな種類のアドバイスでもうれしいです。

タイプは次のように定義されています。

typedef std::vector< cv::RotatedRect > ds_t;

typedef struct id_ {
std::string path;
std::string fileName;
} id_t;

typedef struct dd_ {
    cv::RotatedRect bB;
} dd_t;

typedef std::pair<id_t, std::vector<dd_t> > ts_t;

typedef std::vector<ts_t> tss_t;

次に、型にデータを入力しようとします。

tss_t samples
while (readdir(pDir) != NULL) {
     ts_t sample;
     sample.first.path = _path;
     sample.first.fileName = _name;
     ds_t detections;
     getDetections(_path, detections); //this only filles the detecions byref
     for(size_t i=0; i<detections.size(); i++) {
         dd_t data;
         data.bB = detections[i];
         sample.second.push_back(data); //TODO FIXME
     }
     samples.push_back(sample);
 }

cv::RotatedRect は非常に基本的なクラスです。

class RotatedRect{
   public:
   RotatedRect();
   RotatedRect(const Point2f& _center, const Size2f& _size, float _angle);
   void points(Point2f pts[]) const;

   Point2f center;
   Size2f size;
   float angle; 
};

bool getDetections(const std::string &imagePath, ds_t &detections)
{
  //some processing
  for(size_t i=0;i<5;i++)
    detections.push_back(RotatedRect(cv::Point2f(110.,110.), cv::Size2f(10.,10.), 90.0f));

  return true;
}

うまくいけば、コード全体をコピーしたので、ほとんどの typedef は必要ありません...

すでにスペースを予約しようとしましたが、これはエラーを samples.push_back に延期するだけです。

FIXME によって誤った行が示され、「'std::bad_alloc' のインスタンスをスローした後に終了が呼び出されました」

事前にアドバイスをありがとう。

4

1 に答える 1

1

std::bad_alloc一般的には、メモリが不足していることを意味します。おそらくリークが原因であるか、割り当てが多すぎるためです。また、(まれに)ヒープの破損(割り当てられた配列の最後から実行されたり、ポインターが削除された後にポインターを逆参照したりする)や、プログラムの初期の時点でのその他の未定義の動作が原因で発生することもあります。

プログラムが一度に使用しようとしているメモリの量はどれくらいですか?valgrindのようなリークディテクタを使用して、クリーンアップする必要があるものがあるかどうかを確認できます。

編集

はあなたにたくさんの-1 to __builtin_newことを教えてくれます-それは誰かが偽のサイズで新しいものを呼んでいることをあなたに伝えます。これはおそらくstd::vectorのメンバーであり、サイズを変更しようとします(valgrindからスタックトレースを確認するか、デバッガーを使用して確認できます)。これは、ベクターが破損していることを示します。sample.secondはローカル(スタック上)変数であるため、前に呼び出した関数(おそらく)getDetectionsがオンスタックバッファーまたはある種の配列をオーバーランし、クローバーされたことを示しsample.secondます。したがって、その関数が何をしているのかを注意深く見てください-あなたがコメントアウトしたコードは//some processing。デバッガーを使用して、作成直後にブレークポイントを設定し、sampleによって使用されるメモリにウォッチポイントを設定することもできます。sample.secondそれは壊れています。次に、プログラムを続行します。プログラムは、混乱しているポイントで停止する必要があります。sample.second

コンパイラのヘッダーファイルを読んで、std::vectorがどのように実装されているかを理解すると役立つ場合があります。おそらくそこにはいくつかのsize_tフィールドとポインタフィールドがあります。

于 2012-10-26T17:32:07.400 に答える