Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;阵列的动态内存分配_C++_Memory_Dynamic_Integer_Allocation - Fatal编程技术网

C++ c++;阵列的动态内存分配

C++ c++;阵列的动态内存分配,c++,memory,dynamic,integer,allocation,C++,Memory,Dynamic,Integer,Allocation,我觉得我错过了一些明显的东西,我想不出来。 基本上,信息似乎正确地存储在第一个for循环中。但当我在第二个for循环中打印它时,它只是一个垃圾值。我错过了什么?我对这个比较陌生 bignum::bignum(const string &digits) { int length = digits.length(); ndigits = 0; for (int i = 0; i < length; i++) { if(isdig

我觉得我错过了一些明显的东西,我想不出来。 基本上,信息似乎正确地存储在第一个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;
}
bignum::bignum(常量字符串和数字)
{
int length=数字。length();
ndigits=0;
for(int i=0;icout每次
isdigit(digits[i])
条件为
true
时,您都在动态分配
digit
。 因此,每当您找到一个数字时,您会再次为
数字
分配内存,而有关前面数字的信息将丢失。此外,还存在内存泄漏

在开始
for
循环之前,您应该为
分配一次
数字
,并计算找到的位数,并将找到的位数存储在
数字


此外,无论何时使用完动态分配的内存,都应该释放它,以便可以重用。

假设您不想使用集合,因为您正在完成一个学习练习,那么您应该记住以下几点:当您动态创建阵列时,最好找出元素,然后分配它一次,用数据填充它,使用它,然后取消分配结果

为此,您需要将第一个循环分为两个循环-一个循环计算数字,另一个循环用找到的数字填充数组。分配应在第一个循环之后第二个循环之前进行:

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;
ndigits=0;
//首先,你需要数数数字
for(int i=0;i
如果您希望在获得更多数字时调整数组的大小,请尝试此操作。此版本最初可以容纳10,当数字11出现时,大小会增加10,依此类推。将创建一个新数组,并将旧数据复制到该数组中。删除旧数字数组,然后用新版本替换其指针

这种方法在某些情况下可能会很慢(因为旧的已满时会复制到新的较大的数字),但如果您的数字通常少于10位,则应该可以。如果您的数字通常超过10位,则使用较大的初始数字

int digits_max = 10;
int digits_pos = 0;
int *digit = new int[digits_max];


编辑:将数字\u pos++移动到循环的末尾,上一个版本是错误的。

你正在疯狂地泄漏内存。@chris我有一个数字数组的析构函数。没关系,你在循环内根据条件调用
new
。我看不出你如何为每个
new[]调用
delete[]
call。现在我明白我在做什么了。谢谢!另外,您应该考虑不要直接使用动态分配的内存,而是使用向量或智能指针;)@nyarlathotep yes,indeed@nyarlathotep相信我,如果可以的话,我会使用向量,但这是一个类,它需要动态分配数组。
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;