У меня есть классы Deck and PlayingCard. Объект Deck должен иметь динамически выделяемый массив указателей на объекты игральных карт:Освобождение памяти для массива указателей?
PlayingCard** _playing_cards;
Чтобы инициализировать этот массив, конструктор палубы и построить() функции называются:
Deck::Deck(int size)
{
_total_playing_cards = size;
_deal_next = 0;
build();
}
void Deck::build()
{
_playing_cards = new PlayingCard*[_total_playing_cards];
for(int i = 1; i <= _total_playing_cards; ++i)
{
_playing_cards[i-1] = new PlayingCard(i % 13, i % 4);
}
}
Освобождение памяти, выделенная с «новый» обрабатывается в деструкторе:
Deck::~Deck()
{
for(int i = 0; i < _total_playing_cards; ++i)
{
delete[] _playing_cards[i];
}
delete[] _playing_cards;
}
Я тогда отдельный файл, deck_test.cpp, который имеет основной(), чтобы просто построить и уничтожить объект Deck :
int main()
{
Deck deck(52);
deck.~Deck();
return 0;
}
Это компилируется нормально, но при отладке, отчетов Visual Studio "необработанное исключение в 0x5ab159da (msvcr100d.dll) в игре Cards.exe: нарушение прав доступа чтения расположение 0xfeeefee2: 0xC0000005." При просмотре стека вызовов возникает проблема, когда я использую оператор delete [] в цикле «for» внутри деструктора. Разве это не правильный способ освободить память из массива указателей?
В цикле for не было бы удаления с отсутствием [], потому что вы удаляете пространство и объект, на которые указывает _playing_cards [i]? – octopusgrabbus