В чем проблема с этим кодом?Почему это показывает: Отладочное утверждение не удалось!_BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)? - PullRequest
0 голосов
/ 22 февраля 2012

Что не так в коде?

Какие изменения я должен внести в код, чтобы сделать его защитным?

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

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Деструктор вызывает DeallocateMemory() во второй раз, и это приводит к тому, что delete[] вызывается во второй раз с тем же адресом, что вызывает неопределенное поведение. Чтобы противостоять этому, вы должны изменить

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

, так что когда вызывается деструктор и он вызывает DeallocateMemory(), нулевой указатель равен delete[] d, что означает отсутствие операции.

Кстати, вы должны по крайней мере запретить конструктор копирования и operator= в своем классе, объявив их закрытыми и оставив невыполненными - ваш класс не поддерживает копирование по элементам.

0 голосов
/ 22 февраля 2012

Потому что на каждой итерации цикла вы вызываете delete[] дважды для одного и того же выделенного массива. Один раз через явный вызов DeallocateMemory и один раз через вызов в деструкторе Array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...