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

数据 = 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++;
    }
  }

所以,你有双循环。而且您有 6 次迭代...因此内存损坏将在 t == 2 和 p == 1 上,因为Wph[5] = _Wph如果 Wph 的大小 == 5 为 4,您将尝试执行 Wph 的最大合法索引。

于 2012-07-26T17:44:50.627 回答
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 回答