1

MyObj構造体のベクトルが2つあります。MyObjは次のように定義されます。

struct MyObj
{
   float x, y;
   unsigned int data[8];
   unsigned int tmp[1];

   MyObj(const MyObj &m) 
   {
      x = m.x; y = m.y; 
      tmp[0] = 0;
      for (int i = 0; i < 8; ++i)
      {
         data[i] = m.data[i];
      }
   }
};

次に、2つのベクトルがあります...

vector<MyObj> v1; 
vector<MyObj> v2;
// both get data eventually.

v1.insert(v1.end(), v2.begin(), v2.end());

私の実験では、v2には3535004要素があります。v1も同様のサイズです。また、新しいベクターを作成し、.push_backを使用して両方のベクターから作成してみました。

基本的に、2つのベクトルをマージしようとすると、Visual Studioから「デバッグエラー!R6010、abort()が呼び出されました」というエラーが表示されます。非常に役に立たない...

だから私の質問は:このエラーを引き起こしている可能性があるものと、どうすればそれを解決できますか?ありがとうございました

4

1 に答える 1

3

vtext.cpp:

#include <vector>
#include <iostream>
using namespace std;

struct MyObj
{
   float x, y;
   unsigned int data[8];
   unsigned int tmp[1];

   MyObj() {}
   MyObj(const MyObj &m) 
   {
      x = m.x; y = m.y; 
      tmp[0] = 0;
      for (int i = 0; i < 8; ++i)
      {
         data[i] = m.data[i];
      }
   }
};

int main(void)
{
    vector<MyObj> v1(3535004); 
    vector<MyObj> v2(3535004);
    // both get data eventually.

    v1.reserve(3535004 + 3535004);

    cout << v1.capacity() << endl;

    v1.insert(v1.end(), v2.begin(), v2.end());

    cout << "It worked" << endl;
}

$ g ++ vtest.cpp -o vtest

$ ./vtest

7070008

機能した

それはreserveステートメントの有無にかかわらず機能しました。非常に低いメモリシステム(私の場合は4GB)で作業しているか、エラーが表示されていないものにあります。

編集:@MooingDuckのコメントでの暗黙の提案に従って、まだ問題がある場合は、insert上記のステートメントを次のように置き換えてください

try 
{
        v1.insert(v1.end(), v2.begin(), v2.end());
}
catch (exception& e)
{
   cout << e.what() << endl;
}

そこからそれを取ります。また、上部に追加#include <exception>します。

于 2012-10-23T23:21:05.830 に答える