1

VS2100でエラーが発生し続ける「CRTはヒープバッファの開始前にアプリケーションがメモリに書き込んだことを検出しました」

誰か助けてもらえますか?私のintMainは一番下にあります。delete []コマンドをoperator=関数で実行するとエラーが発生します

#include "intset.h"
const int MAXINITIALSIZE = 5;
int IntSet::numOfArray = 0;

IntSet::IntSet(int a, int b, int c, int d, int e)
{
    numOfArray++;
    int tempArray[] = {a, b, c, d, e};
    size = determineHighest(tempArray) + 1; //determines largest int
    cout << "size is " << size << endl;

    arrayPtr = new bool[size]; //creates array of bool

    for (int i = 0; i < size; i++) //fill bool array 
    {
        arrayPtr[i]= false;  //arrayptr is a bool pointer created in the header
    }   

    for (int i = 0; i < MAXINITIALSIZE; i++)
    {
        arrayPtr[tempArray[i]]= true;
    }

        for (int i = 0; i < size; i++)
    {
        cout << &arrayPtr[i] << endl;
    }
}
IntSet::IntSet(const IntSet &intsetObject)
{
    numOfArray++;
    size = intsetObject.size;

    arrayPtr = new bool[size];

    for (int i = 0; i < size; i++)
    {
        if (intsetObject.arrayPtr[i])
            arrayPtr[i] = intsetObject.arrayPtr[i];
    }
}
IntSet::~IntSet()
{
    --numOfArray;
    delete [] arrayPtr;     
    arrayPtr = NULL;
}

int IntSet::determineHighest(int tempArray[])
{
    int temp = tempArray[0];    
    for (int i = 1; i < MAXINITIALSIZE; i++)
    {
        if (tempArray[i] > temp)
            temp = tempArray[i];
        else
            continue;       
    }
    return temp;
}

IntSet& IntSet::operator=(const IntSet &intsetObject) //ask about IntSet&
{
    cout << "inside operator=" << endl;
    if (&intsetObject != this)
    {
        for (int i = 0; i < size; i++)
        {
            cout << &arrayPtr[i] << endl;
        }
        delete [] arrayPtr;   //HEAP ERROR HERE!
        for (int i = 0; i < size; i++)
        {
            cout << &arrayPtr[i] << endl;
        }
        size = intsetObject.size
        arrayPtr = new bool[size]();
        for (int i = 0; i < size; i++)
        {
            if (intsetObject.arrayPtr[i])
                arrayPtr[i] = intsetObject.arrayPtr[i];
        }
    }
    return *this;
}
ostream& operator<<(ostream &output, const IntSet &intsetObject)
{
    output << "{ ";
    for (int i = 0; i < intsetObject.size; i++)
    {
        if (intsetObject.arrayPtr[i] == true)
        {
            output << i << " ";
        }
        else 
            continue;
    }
    output << "}";
    return output;
}


//main

#include "intset.h"

int main() {

    IntSet object2(9);   

    IntSet object4(3,6);

    object4 = object2;

   return 0;
}
4

1 に答える 1

0

これは、arrayPtr が負のインデックスでアクセスされた場合にのみ発生します。a、b、c、d、e のデフォルトは の宣言で -1 であるIntSet::IntSetと思われるため、set-true ループで arrayPtr[-1] に書き込みます。そこをチェックtempArray[i] >= 0

また、削除した後に配列を印刷することはできないため、削除後にこれらの行を削除する必要がありますが、ゴミのみが印刷されるという点で「無害」である必要がありますが、OS がページを解放する可能性があります。配列を含むと、プログラムのセグメンテーション違反が発生する可能性があります。

if (intsetObject.arrayPtr[i])最後に、copy &=演算子でテストしないでください。そうしないと、ソース配列のすべての「偽」要素が宛先配列で初期化されなくなります (配列を all に初期化new bool[size]しませfalse)。

于 2012-04-06T10:48:52.907 に答える