0

私が取り組んでいるプログラムの目的は、ポインターの動的配列をシミュレートすることにより、デフォルトの整数配列データ型を「改善」するクラスを作成することです。ポインターとポインターの配列を削除しようとすると、「Windows が project4.exe でブレークポイントをトリガーしました。

これは、project4.exe または読み込まれた DLL のバグを示すヒープの破損が原因である可能性があります。

これは、project4.exe にフォーカスがあるときにユーザーが F12 キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。」

class Array
{
private:
    int length;
int* data;
public:
    Array();
    Array(const Array &cpy);
    ~Array();
    bool addint(int toadd);
    bool deletelast();
    int getlength();
    friend ostream& operator<<(ostream &out, const Array &n);
};

ostream& operator<<(ostream &out, const Array &n);

Array::Array()
{
    length = -1;    
    data = NULL;
}

Array::Array(const Array &cpy)
{  
    length = cpy.length;                //value of length is copied

    if (length < 0)
        data = NULL;
    else
    {
        data = new int [length];

        for (int i=0; i<=length; i++)
            data[i] = cpy.data[i];
    }

}    

Array::~Array()
{
    if (length != 0)
        delete [] data;
    else
        delete data;

    data = NULL;
}  

bool Array::addint(int toadd)
{   
    length ++;
    int* point = new int[length];

    for (int i=0; i < length; i++)
        point[i] = data[i];             

    point[length] = toadd;

    if (length != 0)    
        delete [] data; 

    data = point;

    point = NULL;

    return true;
}    

bool Array::deletelast()
{
    int* temppoint;
    if (length > 0)
        temppoint = new int [length-1]; 
    else
        temppoint = new int[0];

    for (int i=0; i<length; i++)        
        temppoint[i] = data[i];

    if (length == 0)
        temppoint[0] = 0;

    length --;
    delete [] data; 
    data = temppoint;
    temppoint = NULL;

    return true;
}  

void menu(Array var)
{
    int selection=0,
        input;
    bool success;
    Array* arrcpy;
    while (selection != 3)
    {
        if (var.getlength() == -1)
        {
            cout << "What would you like to demonstrate?" << endl << "1) Add an integer " << endl
            << "2) Exit" << endl << "Enter your selection: ";
            cin >> selection;
            if (selection == 2)
                selection = 4;
        }
        else
        {
            cout << endl << "Now what would you like to demonstrate?" << endl << "1) Add an integer " << endl
            << "2) Delete the last entered integer" << endl << "3) Copy constructor" << endl << "4) Exit" << endl << "Enter your selection: ";
            cin >> selection;
        }

        if (selection==1)
        {
            cout << endl << "The length of the array before adding a new value is: " << var.getlength() + 1 << endl;
            cout << "Please enter the integer that you wish to add: ";
            cin >> input; 
            success = var.addint(input);
            if (success)
                cout << endl << "The data input was a success!" << endl << "The length of the array is now: " 
                << var.getlength() + 1 << endl << "The new value of the array is: " << var << endl;
            else
                cout << endl << "The input failed" << endl;
        }       
        if (selection == 2)
        {
            cout << endl << "The lenght of the array before the deletion is: " << var.getlength() + 1 << endl 
                << "and the value held in the array is: " << var << endl;
            success = var.deletelast();
            if (success)
                cout << endl << "The data deletion was a success!" << endl << "The length of the array is now: "
                << var.getlength() + 1 << endl << "The new value of the array is: " << var << endl;
            else
                cout << endl << "The deletion failed" << endl;
        }       
        if (selection == 3)
        {
                cout << endl << "The lenght of the array being copied is: " << var.getlength() + 1 << endl 
                << "and the value held in the array is: " << var << endl;
                arrcpy=new Array(var);
                cout << endl << "The length of the copied array is: " << arrcpy->getlength() +1 << endl
                << "and the value contained in the array is: " << *arrcpy;
                delete arrcpy;
        }
    }
}

これは、私が抱えている問題に関して私が持っている関連ソース コードのすべてです。deleteオペレーターとオペレーターのすべてのインスタンスdelete []でこのブレークポイント エラーが発生し、何が間違っているのかわかりません。

編集: コードを書き直して、長さのデフォルト値を -1 ではなく 0 にすると、すべてが機能するようになりました!

4

3 に答える 3

2

コピー コンストラクターには(より小さい、以下ではない)for (int i=0; i<=length; i++)を含める必要があると思います。i<lengthこれは明らかな問題の 1 つです。

addint()また、メソッドで境界を渡しています。配列の最後の要素はインデックス [長さ-1] にあります。

于 2012-12-16T04:52:26.360 に答える
0
int* point = new int[length];

長さは -1 から始まるため、この行の最初の呼び出しは to do になりますnew int[0]。問題になる可能性があります..のセマンティクスを修正しないと主張する場合は、ここlengthが必要ですlength+1

無関係な点ですが、すべての追加を再割り当てするのではなく、それがどのように機能するかを確認する必要std::vectorがあります。スペースがいっぱいになった場合にのみ、過剰に割り当てて再割り当てする必要があります。

于 2012-12-16T05:12:32.110 に答える