2014-09-09 4 views
-1

std::vector<vector<vector> > > 형태로 3 차원 텐서 fafr을 반환하는 함수 getfafr(N,n,twoq)이 있습니다. 동일한 크기가 아닙니다 (즉 fafr[i][j].size()i,j 등으로 다를 수 있음). 이는 push_back()을 사용하여 구현됩니다.std :: vector.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; 
} 
+2

'operator []'에서'at'를 사용하도록 전환하면 문제가 명백해질 것이라는 느낌이 들게됩니다. –

+0

흠, 나를 위해서가 아니야. 그게 무슨 뜻인지''std :: out_of_range'' 오류를주지 않았습니까? – jorgen

+0

'bin()'은 무엇을 반환합니까? –

답변

1
int main() 
{ 
    auto x = getfafr(12, 3, 1); 
    cout << x.size() << ' ' << x[2].size() << ' ' << x[2][0].size() << endl; 
} 

출력 : 당신이 fafr[2][0][10]에 액세스 할 때

3 4 9 

그래서 당신이 범위를 벗어 이동합니다. 의견에서 제안한대로 fafr.at(2).at(0).at(10)으로 변경하면 도움이 될 수 있습니다.

+0

글쎄, 문제를 해결할 수는 없겠지만 분명히 분명해질 것입니다. – zneak

+0

감사합니다! 문제는 사실 '오래된'과 '새로운'fafr의 차이점을 확인하는 또 다른 기능에있었습니다. 그것은'fafr'의 'non-square'속성을 고려하지 않았습니다. – jorgen