次のコードがあり、クラスのコンストラクターで3つのint *にメモリを割り当てています。そして、後でクラスのデストラクタで削除します。デストラクタでint *の2つを削除する際に問題が発生しました(問題が発生している以下のコードにコメントを入れました):
#define CAP 3
class SetOfStacks
{
private:
int* a1;
int* a2;
int* a3;
int index = -1;
public:
void push(int data);
SetOfStacks()
{
a1 = new int[CAP];
a2 = new int[CAP];
a3 = new int[CAP];
}
~SetOfStacks()
{
delete [] a1; //This works just fine
delete [] a2; //heap corruption here
delete [] a3; //heap corruption here
}
};
void SetOfStacks::push(int data)
{
if (index >= 3 * CAP)
{
cout << "stack overflow" << endl;
return;
}
if(index>=-1 && index<=1)
{
index++;
a1[index] = data;
}
else if (index >1 && index<=4)
{
index++;
a2[index] = data;
}
else if (index >4 && index<=7)
{
index++;
a3[index] = data;
}
}
int main()
{
SetOfStacks s;
s.push(10);
s.push(20);
s.push(30);;
s.push(40);
s.push(50);
s.push(60);
s.push(70);
s.push(80);
s.push(90);
return 0;
}
コードを何度もデバッグしましたが、delete [] a2とdelete [] a3を実行すると、なぜHEAPCORRUPTIONが発生するのかわかりません。delete [] a1の実行は問題なく機能します。delete [] a2とdelete [] a3で次のエラーが発生します。
このエラーが発生する理由とその原因を知っていますか(a1の削除が正常に機能する理由がわかりませんが、a2とa3を削除すると、コード内でほぼ同じロジックが実行されますが、このエラーが発生します)。
すべての配列の長さCAP
は3
(ifステートメントで判断して)ですが、配列に書き込むときにインデックスを相対化することはありません。
else if (index >4 && index<=7)
{
index++;
a3[index] = data;
}
これらの行では8
、配列までのインデックスを書き込むことができます。これがエラーが発生する理由です。
CRTは、ヒープバッファの終了後にアプリケーションがメモリに書き込んだことを検出しました。
を使用してインデックスに書き込むときにモジュロ演算子を使用すると、これを修正できますindex % CAP
。これが任意CAP
ので適切に機能するためには、ifステートメントも>= N * CAP
境界として使用する必要があります。
else if (index >= 2 * CAP) // no upper check needed in an if-else chain
{
a3[index++ % CAP] = data; // you can also do index++ after
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加