我有以下代码:
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的东西,所以任何建议/帮助都会被贬低。
非常感谢你。
答案 0 :(得分:4)
永远不要像使用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]
访问某个对象,但您不必担心会释放任何内容,因为当它超出范围时它会自动释放。