gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:52:31 24 4
gpt4 key购买 nike

我有以下代码:

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] 访问对象,但您不必担心释放任何东西,因为它会在超出范围时自动释放自己。

关于c++ - 在不知道大小的情况下在 Borland C++ 构建器中定义 AnsiString 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24435796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com