このコードの問題は何ですか?なぜそれが表示されているのか:デバッグアサーションは失敗しました! _block_type_is_valid(phead-> nblockuse)?

StackOverflow https://stackoverflow.com/questions/9393512

質問

コードの何が問題になっていますか?

コードを防御するために、コードにどのような変更を加える必要がありますか?

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();
}
}

enter image description here

役に立ちましたか?

解決

デストラクタコール DeallocateMemory() 二度目の間、それはにつながります delete[] 未定義の動作をトリガーするのと同じアドレスで2度目の呼び出されます。これに対してグアルグに変更する必要があります

void Array::DeallocateMemory()
{
    delete [] this->m_ArrayContainer;
    this->m_ArrayContainer = 0;
}

デストラクタが呼び出され、それが呼び出すとき DeallocateMemory() ヌルポインターです delete[]Dはopです。

ところで、少なくともコピーコンストラクターを禁止する必要があります operator= クラスではプライベートを宣言し、実装されていないままにしておくことで、クラスはメンバーワイズのコピーをサポートしていません。

他のヒント

ループの各反復で呼び出すからです delete[] 同じ割り当てられた配列で2回。明示的な呼び出しを介して DeallocateMemory そして一度、デストラクタの呼び出しを介して Array.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top