![](/img/trans.png)
[英]Diffence with AnsiString and AnsiString transfered from UnicodeString in C++ builder
[英]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.