繁体   English   中英

数组的c ++动态内存分配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM