2

なぜこのデバッグエラーが発生するのか、一生理解できません。

ヒープの破損が検出されました:0x004cF6c0の通常のブロック(#126)の後、CRTは、ヒープバガーの終了後にアプリケーションがメモリに書き込んだことを検出しました。

新しい演算子を使用するときはいつでもメモリを解放する必要があることを理解していますが、それでも問題が発生します。

何らかの理由で、プログラムが再帰関数で正しく終了しません。私はそれをデバッグし、ブレークポイントを使用してコードの各行を調べました。

countSumのifステートメントの最後で、どういうわけかiから1を引いてから、ifブロックに再び入ります。

なぜこれが発生するのですか?

/*this program calculates the sum of all the numbers in the array*/

#include <iostream>
#include <time.h>

using namespace std;

/*prototype*/
void countSum(int, int, int, int*);

int main(){

    bool flag;
    int num;

    int sum = 0, j=0;
    int *array =  new int;

    do{

        system("cls");
        cout<<"Enter a number into an array: ";
        cin>>array[j];

        cout<<"add another?(y/n):";
        char choice;
        cin>>choice;
        choice == 'y' ? flag = true : flag = false;

        j++;

    }while(flag);

    int size = j;

    countSum(sum, 0, size, array);
    //free memory
    delete array;
    array = 0;

    return 0;
}

void countSum(int sum, int i, int size, int *array){

    if (i < size){
        system("cls");

        cout<<"The sum is  :"<<endl;
        sum += array[i];
        cout<<"...."<<sum;

        time_t start_time, stop_time;
        time(&start_time);

        do
        {
            time(&stop_time); //pause for 5 seconds
        }
        while((stop_time - start_time) < 5);

        countSum(sum, (i+1) , size, array); //call recursive function
    }
}
4

2 に答える 2

4

array単一の に十分なスペースを保持しますint:

int *array = new int;

ただし、複数挿入しようとすると、int使用できないメモリへの書き込みが発生する可能性があります。a を使用するか、割り当てられる前に入力される s のstd::vector<int>最大数を事前に知っておく必要があります。intarray

これが学習課題であり、使用したくない場合は、入力したいstd::vector<int>の数を入力するようにユーザーに求めることができますint

std::cout << "Enter number of integers to be entered: ";
int size = 0;
std::cin >> size;
if (size > 0)
{
    array = new int[size];
}

次に、s のsize数を受け入れintます。を使用するdelete[]場合に使用しますnew[]

于 2012-07-19T21:22:21.580 に答える
0

解決策は、サイズ new int[size] を設定することでした....ただし、動的な場合はサイズを設定する必要はありませんでした。

于 2012-07-19T21:41:19.923 に答える