[英]c++ dynamic memory allocation for arrays
我觉得我缺少明显的东西,无法弄清楚。 基本上,似乎信息已正确存储在第一个for循环中。 但是,当我在第二个for循环中将其打印出来时,它仅有的垃圾值。 我想念什么? 我对此比较陌生
bignum::bignum(const string &digits)
{
int length = digits.length();
ndigits = 0;
for (int i = 0; i < length; i++)
{
if(isdigit(digits[i]))
{
ndigits++;
digit = new int[ndigits];
int tmpInt = digits[i] - '0';
digit[i] = tmpInt;
}
if(isalpha(digits[i]))
{
break;
}
cout <<"step "<< i << " " << digit[i] << endl;
}
for (int i = 0; i < ndigits; i++)
{
cout << digit[i] << " ";
}
cout << endl;
cout << "digits" << ndigits << endl;
cout << endl;
}
每当isdigit(digits[i])
条件为true
时,您就在动态分配digit
。 因此,每当找到一个数字时,便会再次为该digit
分配存储空间,并且有关先前数字的信息将会丢失。 此外,存在内存泄漏。
您应该在for
循环开始之前分配一次digit
for
并计数找到的数字并将找到的数字存储在digit
。
另外,您应该在处理完任何动态分配的内存后将其释放,以便可以重复使用。
假设您不想因为完成学习练习而使用集合,则应牢记以下几点:动态创建数组时,最好先找出要有多少个元素,然后再分配一次,将其填充数据,使用它,然后取消分配结果。
为此,您需要将您的第一个循环分成两个循环-一个循环对数字进行计数,另一个循环用找到的数字填充数组。 分配应在第一个循环之后和第二个循环之前进行:
ndigits = 0;
// First, you need to count the digits
for (int i = 0; i < length; i++)
{
if(isdigit(digits[i]))
{
ndigits++;
}
if(isalpha(digits[i]))
{
break;
}
}
// Next, allocate the array for your digits
int *digit = new int[ndigits];
int *dp = digit;
// Now go through the string again, and add digits to the newly allocated array
for (int i = 0; i < length; i++)
{
if(isdigit(digits[i]))
{
(*dp++) = (digits[i] - '0');
}
if(isalpha(digits[i]))
{
break;
}
}
... // Use your digit[] array here...
// Once you are done, free the array
delete[] digit;
如果要在获得更多数字时调整数组大小,请尝试此操作。 此版本最初有10个空间,当数字11出现时,其大小增加10。 创建一个新数组,并将旧数据复制到其中。 删除旧的数字数组,然后将其指针替换为新版本。
在某些情况下,此方法可能会比较慢(因为当旧的文件已满时复制到新的文件),但是如果您的数字通常少于10位,则应该可以。 如果您通常大于10,请使用更大的初始数字。
int digits_max = 10;
int digits_pos = 0;
int *digit = new int[digits_max];
...
if(isdigit(digits[i])) {
if (digits_pos == digits_max) {
int new_max = digits_max + 10;
int *digit_tmp = new int[new_max];
// Copy from old array to new
for (int i = 0; i < digits_max; i++) {
digit_tmp[i] = digit[i];
}
delete[] digit; // Free old memory, or your RAM gets full
digit = digit_tmp;
digits_max = new_max;
}
}
else { // Always break if not int
break;
}
int tmpInt = digits[i] - '0';
digit[digits_pos] = tmpInt;
digits_pos++;
退出之前(或使用完数字数组后),应删除它:
delete[] digit;
编辑:将digits_pos ++移动到循环结束,上一个版本错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.