2011-09-24 194 views
0

我正在解決一個量子機器問題,它需要我通過操縱一些矩陣來找到一些特徵值。這個問題的細節是不相關的,我只需要幫助C++的問題,我是這個語言的新手,幾個小時後,我發現任何嘗試自己解決這個問題都是徒勞的,所以我轉向你尋求幫助。刪除雙指針(矩陣)

我有這個問題,其中glibc在我的程序結束時檢測到錯誤,我無法正確釋放,但在這裏複製粘貼太大,所以我只會複製實際出現錯誤的部分。

void hamiltonian(int, double **&); 

int i,j; 

int main() 
{ 
int N = 1000; double **A; 

hamiltonian(N, A); 

//Physics here 
. 
. 
. 
. 
. 
//Delete 
for(i=0; i<N; i++){delete []A[i];} 
delete []A; 

return 0; 
} 

void hamiltonian(int N, double **&A) 
{ 
A = new double *[N]; 
for(i=0; i<N; i++) 
{ 
A[i] = new double[N]; 
for(j=0; j<N; j++) 
{ 
if(i==j)A[i][j] = 2; 
if(i==j+1 || i==j-1){A[i][j] = 1;} 
} 
} 
} 

根據我的教授我有同樣的功能要解除我分配,但我壓根沒想到關於釋放被幾乎與我的項目完成後,所以我必須重新編寫大量的代碼,該問題是我不能在哈密爾頓函數內部釋放A,因爲我需要它在其他函數中(在物理內部)。

一定有辦法解決這個問題嗎?可能聽起來有點無知,但這聽起來像是一個效率較低的設計,如果我不得不按照我分配的相同函數進行釋放。

+0

編輯添加刪除[A]和A [1] =新的雙[N]; – arynaq

+0

實現自己的矩陣功能對於學習C++可能行得通,但是如果你的主要目標是量子機器問題,找到一個能夠在矩陣上操作並使用特徵值的現有庫不是更好嗎? – maxim1000

+1

@ maxim1000是的,但它沒有那麼多的樂趣:p – arynaq

回答

2

根據我的教授我有同樣的功能要解除我分配

這是純粹的愚蠢。有時(幾乎總是)您需要在函數外部使用分配的結構。對於對象來說肯定是錯誤的,因爲構造函數和析構函數是不同的函數。

任何方式,你可以逃脫不使用類,如果你犯了一個矩陣struct和相關newMatrixdeleteMatrix功能:)

#include <cstddef> 
#include <iostream> 

using namespace std; 

struct Matrix 
{ 
    int n; 
    int m; 
    double** v; 
}; 

Matrix newMatrix (int n, int m) 
{ 
    Matrix A; 
    A.n = n; 
    A.m = m; 
    A.v = new double*[n]; 
    for(int i = 0; i < n; i++){ 
     A.v[i] = new double[m]; 
    } 
    return A; 
} 

Matrix newHamiltonianMatrix (int n, int m) 
{ 
    Matrix A = newMatrix(n, m); 
    for(int i = 0; i < A.n; i++){ 
     for(int j = 0; j < A.m; j++){ 
      A.v[i][j] = 0.0; 
      if(i == j){ 
       A.v[i][j] = 2.0; 
      } 
      if(i == j + 1 or i == j - 1){ 
       A.v[i][j] = 1.0; 
      } 
     } 
    } 
    return A; 
} 

void deleteMatrix (Matrix A) 
{ 
    for(int i = 0; i < A.n; i++){ 
     delete [] A.v[i]; 
    } 
    delete [] A.v; 
    A.v = NULL; 
} 

int main() 
{ 
    Matrix A = newHamiltonianMatrix(10, 20); 
    for(int i = 0; i < A.n; i++){ 
     for(int j = 0; j < A.m; j++){ 
      cout << A.v[i][j] << " "; 
     } 
     cout << endl; 
    } 
    deleteMatrix(A); 
} 
+0

將原始代碼中的A = null設置爲原始刪除嗎?會不會佔用NxN雙打成爲0指針? – arynaq

+1

不,這並不會刪除分配的double []和double [] []數組。 C++不使用垃圾回收(好吧,有第三方的GC庫,但這是另一個話題) – Frigo

+0

謝謝,你的建議將爲我省去重寫我的整個代碼的麻煩,我很樂意接受這個作爲我的問題的答案,但希望有人會擴展爲什麼glibc不喜歡我刪除我的矩陣。我認爲我的教授意味着我必須用漢密爾頓語將它刪除,因爲glibc給了我一個錯誤,他的具體意思是這個,而不是一般的刪除指針。我不明白刪除邏輯在哈密爾頓函數之外不起作用。 – arynaq

2
delete A; 

需要是

delete[] A; 

如果你new[],您必須delete[]它。此外,請使用vector - 他們會自己照顧自己。

vector<vector<double>> matrix; 
+0

當然,我忘了[]中的[]上面的代碼,它是在我的原始。我們不應該使用/構造類,這是計算物理學的一個類(主要是關於不同問題及其實現的算法,其中C++是由投票決定的)。 – arynaq

+0

@ user948652:如果你想編寫C++,你必須使用類。這不是一個選項。誰決定不使用課程來教你分配是一個白癡,你應該開槍射擊,然後再使用課堂。 – Puppy

+0

@DeadMG:除非我在標準中遺漏了一些不允許使用原始類型(基本類型數組)的規則,否則您的語句「*如果您想編寫C++,您必須**使用類,它不是選項。*「是無稽之談。 –

0

您的代碼有幾個問題。

(1)不分配存儲器到的A指針成員。即A[i]未分配new[]。因此訪問它們是未定義的行爲

(2)如果分配給new[],您必須對指針做delete[]。在你的其他功能delete A;是錯誤的。使用delete[] A;

(3)使用new/new[]不是唯一的分配方式。事實上,你應該在沒有選擇的情況下使用這種動態分配。從你的代碼看來,你是硬編碼N=1000。所以最好使用2D數組。

const int N = 1000; // globally visible 
int main() 
{ 
    double A[N][N]; 
    ... 
} 
void hamiltonian (double (&A)[N][N]) 
{ 
    ... 
} 
+0

最後,「你必須在你分配的同一個函數中釋放」這個想法完全是無稽之談。 –

+0

回想起來,對整個600行進行復制可能更爲明智,我犯了另一個錯誤(該文件在我的linux中,我在windows中)。我當然分配A [i] = new double [N];在循環內。至於第2點,如果你查看我對上一張海報的評論,也是另一個錯誤。 N也是一個輸入變量,但爲了簡化我的問題,我只是將其設置爲常量。 – arynaq

+0

-1爲局部變量'double A [N] [N];'N = 1000?真的嗎?結果是這個網站的名字。 –