在不知道大小的情况下在Borland c++构建器中定义AnsiString矩阵

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

本文关键字:定义 矩阵 AnsiString 构建 Borland 不知道 情况下 c++      更新时间:2023-10-16

我有以下代码:

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)

对象的构造函数不会被调用(之后必须使用放置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]访问对象,但是您不必担心释放任何东西,因为当它超出作用域时,它会自动释放自己。