C++ c++;阵列的动态内存分配
我觉得我错过了一些明显的东西,我想不出来。 基本上,信息似乎正确地存储在第一个for循环中。但当我在第二个for循环中打印它时,它只是一个垃圾值。我错过了什么?我对这个比较陌生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
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;i cout每次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;