2014-10-16 64 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;被正確輸出的值,並且所有值都被正確地被寫入(在前面的代碼)的文件。但是,當我使用行cout << F_KN[9] << endl;作爲測試來查看該位置是否保持正確的值時,它將打印出0,它與for循環中的i = 1tst位置不同。 注意:值爲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 2014-10-16 11:35:26

+0

好吧,沒有,雖然我得到一個警告,我可能是未初始化?我只是爲了跟蹤數組中的哪個位置,每個F_KN,F_inertia和F_drag的值都在。 – user3460758 2014-10-16 11:43:31

+0

我不需要動態分配數組嗎? – user3460758 2014-10-16 11:44:49

回答

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 2014-10-16 12:06:55

+0

這似乎工作..謝謝! – user3460758 2014-10-16 12:08:04