繁体   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