std :: vector <double> destroy抛出sigabrt </double>

时间:2012-07-26 17:27:53

标签: c++ vector sigabrt

我有一个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;
};

3 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分: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,因为如果它的大小== 5是4,你将尝试为Wph做Wph[5] = _Wph和最大合法索引。

答案 2 :(得分: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()检查您是否未超过数组的末尾并抛出异常。