2014-10-16 11 views
0

나는 관련된 것으로 생각되는 두 가지 문제점이 있습니다. 변수의 동적 배열을 만든 다음 배열의 다른 특정 멤버에 액세스하려고합니다. 문제의 원인이되는 코드 세그먼트이다 :*** glibc 감지 *** 및 동적 할당 문제 - C++

 double *F_inertia, *F_drag, *F_KN; 
     i = 0; 
     F_inertia = new double[i]; 
     F_drag = new double[i]; 
     F_KN = new double[i]; 
     t = 0; 
     x = 0; 

     for (z = 0; z >= -d; z = z-8) { 
      F_drag[i] = ((0.5 * rho * Cd * Diam * ux * fabs(ux))); 
      F_inertia[i] = (rho * Cm * Vol * ax); 
      F_KN[i] = (F_drag[i] + F_inertia[i])/1000; 
      cout << i << "\t" << F_KN[i]<< endl; 
      i++; 
     } 
       cout << F_KN[1] << endl; 

     delete[] F_inertia; 
     delete[] F_drag; 
     delete[] F_KN;  

라인 cout << i << "\t" << F_KN[i]<< endl; 정확하게 값을 출력하고, 모든 값이 올바르게 (이전 코드) 파일에 기록되고있다. 그러나 그 라인이 을 테스트로 사용하여 올바른 값을 보유하고 있는지 확인하기 위해 for 루프의 i = 1tst 위치와 동일한 값이 아닌 0을 출력합니다. 참고 : F_KN[5]-F_KN[8]의 값은입니다. 낮은 순위 중 하나가 아닙니다! 나는 이것으로 매우 혼란 스럽다 !! 읽기에서

*** glibc detected *** ./monopile_deflection: free(): invalid next size (fast): 0x0000000001365260 *** 
monopile_deflection: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 
Aborted (core dumped) 

나는 이것이 잘못을 할당과 관련이있다 알고 코드를 컴파일하고 실행 한 후

둘째,이 (첫 번째 문제는 제외) 나에게 올바른 값을주고 나서, 온다 배열 또는 존재하지 않는 배열 값에 액세스하려고하지만 문제가있는 곳을 볼 수 없습니까?

도움이나 조언을 미리 보내 주셔서 감사합니다.

+3

'F_inertia = new double [i];와'i = 0; '이 이상하게 느껴진다. http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory – fritzone

+0

내가 초기화되지 않았을 수도 있다는 경고를 받았지만 그래도 괜찮 았어? 나는 단순히 배열의 어느 위치에서 F_KN, F_inertia 및 F_drag의 각 값을 추적하고 있는지를 사용하고 있습니다. – user3460758

+0

배열을 동적으로 할당 할 필요가 없습니까? – user3460758

답변

0
i = 0; 
F_inertia = new double[i]; 
F_drag = new double[i]; 
F_KN = new double[i]; 

나중에 프로그램에서 i을 증가 시키면이 줄에서 할당되는 메모리 양이 변경되지 않습니다.

따라서 세 개의 크기가없는 배열을 할당 한 다음 존재하지 않는 요소에 쓰기 시작했습니다.
많은 메모리가 손상되었습니다.

어느

:

  • 당신이 당신의 할당하기 전에 실행 별도의 루프에서 i에 대한 적절한 값을 결정하거나,
  • 가 자동으로 성장할 수있는 std::vector<double> 사용합니다.
+0

i에 대해 별도의 값을 결정할 경우, 다음을 사용합니다 : 'F_inertia = new double [10]'? – user3460758

+0

그게 잘 된 것 같아서 ... 고마워! – user3460758