我有一个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;
};
答案 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()检查您是否未超过数组的末尾并抛出异常。