このコードの問題は何ですか?なぜそれが表示されているのか:デバッグアサーションは失敗しました! _block_type_is_valid(phead-> nblockuse)?
-
29-10-2019 - |
質問
コードの何が問題になっていますか?
コードを防御するために、コードにどのような変更を加える必要がありますか?
array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_
class Array
{
private:
int * m_ArrayContainer;
public:
Array();
void AllocateMemoryOfSize(int size);
void DeallocateMemory();
void SetElementsIntoTheIndex(int index, int value);
int GetElementFromIndex(int index);
int operator [] (int index);
~Array();
};
#endif
array.cpp
#include "Array.h"
#include <iostream>
Array :: Array()
{
this->m_ArrayContainer = NULL;
}
void Array :: AllocateMemoryOfSize(int size)
{
this->m_ArrayContainer = new int[size];
}
void Array :: DeallocateMemory()
{
delete [] this->m_ArrayContainer;
}
void Array :: SetElementsIntoTheIndex(int index, int value)
{
this->m_ArrayContainer[index] = value;
}
int Array :: GetElementFromIndex(int index)
{
return this->m_ArrayContainer[index];
}
int Array :: operator [] (int index)
{
return this->m_ArrayContainer[index];
}
Array :: ~Array()
{
this->DeallocateMemory();
}
main.cpp
#include <iostream>
#include "Array.h"
int main()
{
for(int i=0 ; i<250 ; i++)
{
Array array1;
array1.AllocateMemoryOfSize(3);
array1.SetElementsIntoTheIndex(0, 10);
array1.SetElementsIntoTheIndex(1, 10);
array1.SetElementsIntoTheIndex(2, 10);
/*array1.SetElementsIntoTheIndex(0, NULL);
array1.SetElementsIntoTheIndex(1, NULL);
array1.SetElementsIntoTheIndex(2, NULL);*/
array1.DeallocateMemory();
}
}
解決
デストラクタコール DeallocateMemory()
二度目の間、それはにつながります delete[]
未定義の動作をトリガーするのと同じアドレスで2度目の呼び出されます。これに対してグアルグに変更する必要があります
void Array::DeallocateMemory()
{
delete [] this->m_ArrayContainer;
this->m_ArrayContainer = 0;
}
デストラクタが呼び出され、それが呼び出すとき DeallocateMemory()
ヌルポインターです delete[]
Dはopです。
ところで、少なくともコピーコンストラクターを禁止する必要があります operator=
クラスではプライベートを宣言し、実装されていないままにしておくことで、クラスはメンバーワイズのコピーをサポートしていません。
他のヒント
ループの各反復で呼び出すからです delete[]
同じ割り当てられた配列で2回。明示的な呼び出しを介して DeallocateMemory
そして一度、デストラクタの呼び出しを介して Array
.
所属していません StackOverflow