簡體   English   中英

在不知道大小的情況下在Borland C ++構建器中定義AnsiString矩陣

[英]Defining an AnsiString matrix in Borland C++ builder without knowing the size

我有以下代碼:

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東西很菜鳥,所以任何建議/幫助都會被理解。

提前非常感謝您。

切勿使用malloc分配非POD對象,例如:

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

該對象的構造函數將不會被調用(之后,您必須使用placement new運算符手動調用它)。 上面的行只是懇求出現內存錯誤。

請使用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]訪問對象,但是不必擔心釋放任何東西,因為當對象超出范圍時,它將自動釋放自己。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM