std::vector.push_back() 的奇怪(记忆?)问题
Posted
技术标签:
【中文标题】std::vector.push_back() 的奇怪(记忆?)问题【英文标题】:Strange (memory?) issue with std::vector.push_back() 【发布时间】:2014-09-09 17:20:08 【问题描述】:我有一个函数getfafr(N,n,twoq)
,它以std::vector<vector<vector> > >
的形式返回一个3 维张量fafr
。它没有统一的大小(即fafr[i][j].size()
对于不同的i,j
等可能不同),这是使用push_back()
实现的。
奇怪的是,以完全相同的参数运行函数会导致不同的张量;有时至少有些元素是胡言乱语。一个例子是在代码的不同点运行getfafr(12,3,1)
,一次给出fafr[2][0][10]=270
,另一次给出fafr[2][0][10]=-6.88461e-309
。
奇怪的是,如果我总是在使用std::cout
创建后将张量打印到屏幕上,问题就会消失。
我的感觉是,以这种方式使用push_back()
会导致内存问题,例如较早的数据被后来的数据覆盖等。这是函数:
vector<vector<vector<double> > > getfafr(int N, int n, int twoq)
vector<vector<vector<double> > > fafr;
for(int nu=0;nu<n;nu++)
fafr.push_back(vector<vector<double> >(twoq+nu+1));
for(int om=0;om<=twoq+nu;om++)
for(int tmo=0;tmo<N-nu-twoq;tmo++)
fafr[nu][om].push_back(bin(twoq+nu, om));
for(int i=N-tmo-nu-twoq;i<=N-1-tmo-om;i++) fafr[nu][om][tmo]*=i;
for(int i=tmo+1;i<=tmo+om;i++) fafr[nu][om][tmo]*=i;
return fafr;
【问题讨论】:
从使用operator[]
切换到使用at
,我感觉问题会变得很明显。
嗯,不适合我。如果这就是你的意思,它没有给出'std::out_of_range'
错误?
bin()
返回什么?
对不起,bin
是二项式系数
【参考方案1】:
int main()
auto x = getfafr(12, 3, 1);
cout << x.size() << ' ' << x[2].size() << ' ' << x[2][0].size() << endl;
输出:
3 4 9
因此,当您尝试访问 fafr[2][0][10]
时,您会越界。将其更改为 fafr.at(2).at(0).at(10)
(如 cmets 中的建议)可以帮助您。
【讨论】:
好吧,这并不能解决问题,但它肯定会让问题更加明显。 谢谢!问题实际上出在另一个检查“旧”和“新”fafr
之间差异的函数中;它没有考虑fafr
的“非正方形”属性。以上是关于std::vector.push_back() 的奇怪(记忆?)问题的主要内容,如果未能解决你的问题,请参考以下文章
没有匹配函数调用‘std::vector::push_back(std::string&)’
正确使用用户定义类型的 std::vector.push_back()
想简化我的 std::vector push_back 使用