2014-06-26 139 views
1

定義在Borland的C++ Builder的一個AnsiString類型矩陣我有以下代碼:不知道大小

int cl = value1; 
int fl = value2; 
AnsiString **mat = NULL; 
mat = (AnsiString **)malloc(sizeof(AnsiString)*fl); 
for(int i=0; i < fl; i++) mat[i]=(AnsiString *)malloc(sizeof(AnsiString)*cl); 
int count = 0; 
for (int f=0; f<fl; f++){ 
     for (int c=0; c<cl; c++){ 
      if (count < str.Length()) mat[f][c]=str[++count]; 
      else mat[f][c]='X'; 
     } 
} 

但它無法正常工作。我讀了幾個「如何」,但我找不到正確的方法來做到這一點。

我很喜歡這個malloc的東西,所以任何建議/幫助將被認爲。

非常感謝您提前。

+2

[C++標準庫](http://en.cppreference.com/w/cpp)有許多東西,包括許多[容器](http://en.cppreference.com/w/cpp/container) 。標準庫的使用將極大地幫助您成爲C++程序員。 –

+1

噢,並檢查您使用'sizeof'運算符。 'sizeof(AnsiString)'很可能與'sizeof(AnsiString *)'不一樣。 –

回答

4

使用malloc分配從來沒有非POD對象,就像是:

mat[i]=(AnsiString *)malloc(sizeof(AnsiString)*cl) 

對象的構造函數將不會被調用(你必須手動事後調用它使用放置新運營商)。上面的行只是懇求一個內存錯誤。

使用new[]操盤手:

AnsiString **mat = mat = new AnsiString*[fl]; 
for(int i=0; i < fl; i++) mat[i] = new AnsiString[cl]; 

,您仍然可以訪問使用mat[m][n],其中m是行號和n是列數的對象。

完成後不要忘記釋放使用delete[]內存:

for(int i=0; i < fl; i++) delete[] mat[i]; 
delete[] mat; 

但是,使用new[]/delete[]這樣的,如果你不小心,仍然容易出錯。我建議你使用std::vector代替,並讓它管理所有的內存給你:

std::vector< std::vector<AnsiString> > mat(f1); 
for(i = 0; i < f1; ++i) mat[i].resize(c1); 

,您仍然可以訪問使用mat[m][n]對象,但你不必擔心釋放什麼,因爲它會當它超出範圍時自動釋放自身。

+0

謝謝。這工作像一個魅力。 – Zariweya