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 是瓶颈

想简化我的 std::vector push_back 使用

std::vector push_back报错Access violation

C++ 11 std::vector push_back 方法多次调用 copy/dest?