6

私はstd::vector<double>GDBがこれらの値を含むことを示しています:

Wph <5 items>            vector<double>
    [0] 10.750281685547618      double
    [1] 0.0053087812248281997   double
    [2] 4.2807534148705719e-08  double
    [3] 5.7427427663508097e-07  double
    [4] 0                       double

関数の終了時に自動破棄されると、SIGABRT がスローされます。

0   raise   raise.c 64  0x7fffeec5ad05  
1   abort   abort.c 92  0x7fffeec5eab6  
2   __libc_message  libc_fatal.c    189 0x7fffeec93d7b  
3   malloc_printerr malloc.c    6283    0x7fffeec9fa8f  
4   _int_free   malloc.c    4795    0x7fffeec9fa8f  
5   __libc_free malloc.c    3738    0x7fffeeca38e3  
6   __gnu_cxx::new_allocator<double>::deallocate    new_allocator.h 95  0x457828    
7   std::_Vector_base<double, std::allocator<double> >::_M_deallocate   stl_vector.h    146 0x45567e    
8   std::_Vector_base<double, std::allocator<double> >::~_Vector_base   stl_vector.h    132 0x4542b3    
9   std::vector<double, std::allocator<double> >::~vector   stl_vector.h    314 0x453a96

どうしたの?

  int data = 0;
  vector<double> Wph;
  Wph.resize(mydata.data.size());

  for (size_t t = 0; t < mydata.t.size(); t++)
  {
    double t0 = (PI / 180.0) * mydata.t[i];

    for (size_t p = 0; p < mydata.p.size(); p++)
    {

      double _Wph = 5; //arbitrary math
      Wph[data] = _Wph;

      data++;
    }
  }

struct mydata
{
  vector<double> t, p;
  vector<point> data;
};
4

3 に答える 3

3

必ず確認してくださいmydata.data.size() == mydata.t.size() * mydata.p.size()

要素を含むmydata.t.size() * mydata.p.size()ベクトルに値を割り当てました。mydata.data.size()これは配列にバインドされた書き込みです。

多分あなたはvector::push_back()代わりに試してみるべきです。あれは、

vector<double> Wph;

for (size_t t = 0; t < mydata.t.size(); t++)
{
  double t0 = (PI / 180.0) * mydata.t[i];

  for (size_t p = 0; p < mydata.p.size(); p++)
  {
    double _Wph = 5; //arbitrary math
    Wph.push_back(_Wph);
  }
}
于 2012-07-26T17:39:03.613 に答える
0

あなたはWphを小さくしすぎていると思います。何であるかはわかりませんmydata.data.size()が、小さすぎると思います。

コードから、正しいサイズのように見えます

  Wph.resize(mydata.p.size() * mydata.t.size());

しかし、C++ では防御的なコードを書こうとするため、そのような間違いを犯しにくくなっています。

  vector<double> Wph;

  for (size_t t = 0; t < mydata.t.size(); t++)
  {
    double t0 = (PI / 180.0) * mydata.t[t];

    for (size_t p = 0; p < mydata.p.size(); p++)
    {
      double _Wph = 5; //arbitrary math
      Wph.push_back(_Wph);
    }
  }

サイズを事前に割り当てる必要がある場合は、少なくとも変更します

      Wph[data] = _Wph;

      Wph.at(data) = _Wph;

at() は [] と同じように機能しますが、at() は配列の末尾を超えていないことを確認し、例外をスローします。

于 2012-07-26T18:01:46.190 に答える
0

データ = 5、p = 2、t = 3

  for (size_t t = 0; t < mydata.t.size(); t++)
  {
    double t0 = (PI / 180.0) * mydata.t[i];

    for (size_t p = 0; p < mydata.p.size(); p++)
    {

      double _Wph = 5; //arbitrary math
      Wph[data] = _Wph;

      data++;
    }
  }

したがって、二重ループがあります。Wph[5] = _Wphそして、6回の反復があります...したがって、メモリの破損はt == 2およびp == 1になります。これは、サイズ== 5が4の場合、Wphの最大の正当なインデックスを実行しようとするためです.

于 2012-07-26T17:44:50.627 に答える