Visual Studio 2010 — Сбой отладочного утверждения C ++, выражение: _BLOCK_TYPE_IS_VALID (pHead — blockUse)

Я пишу программу, которая похожа на информационную систему для кино. Я начинающий в C ++.

После каждой компиляции я получаю это сообщение об ошибке. Я уверен, что он получает ошибку при вызове dectructor.

Я прочитал много постов, которые касаются этой ошибки. Но я до сих пор не могу помочь. У меня есть другие классы, но я не думаю, что ошибка есть. Потому что, когда я комментирую контент в деструкторе, после компиляции не возникает никаких ошибок. Если вам нужно, я опубликую код других классов в моем проекте.

Пожалуйста, помогите мне, если можете. Спасибо за вашу готовность и помощь.

Это мой код класса, где он получает ошибку. Извините за мой ужасный английский

ЗАГОЛОВОК ФАЙЛ

#pragma once
#include "Film.h"#include <string>
using namespace std;

class Kino
{
private:
Film* aFilmy;
unsigned short int aPocetFilmov;
string aNazov;public:
Kino(void);
~Kino(void);

void nastavNazov(string paNazov);
void pridajFilm(string paNazov);
void vypisFilmy();

Film* dajFilm(string paNazov);
string dajNazov(){ return aNazov; };
};

CPP FILE

#include "Kino.h"
Kino::Kino(void){
aFilmy = NULL;
aPocetFilmov = 0;
}

Kino::~Kino(void){
if(aFilmy != NULL){
delete[] aFilmy;
aFilmy = NULL;
}
}

void Kino::pridajFilm(string paNazov){
Film film(paNazov);

if(aFilmy == NULL){
aFilmy = new Film[1];
aFilmy[0] = film;
aPocetFilmov++;
}else{
Film* temp = aFilmy;
aFilmy = new Film[aPocetFilmov + 1];

for(unsigned short int i = 0; i < aPocetFilmov; i++){
aFilmy[i] = temp[i];
}

aFilmy[aPocetFilmov] = film;
aPocetFilmov++;

delete [] temp;
}
}

void Kino::vypisFilmy(){
for(unsigned short int i = 0; i < aPocetFilmov; i++){
cout << "[" << i << "] - " << aFilmy[i].dajNazov() << endl;
}
}

Film *Kino::dajFilm(string paNazov){

for(unsigned short int i = 0; i < aPocetFilmov; i++){
if(aFilmy[i].dajNazov() == paNazov){
return &aFilmy[i];
}
}

return NULL;
}

Film.h — Фильм

#pragma once
#include <string>
#include "Sala.h"using namespace std;class Film
{
private:
string aNazov;
Sala aSala;

public:
Film(string paNazov);
Film(void);
~Film(void);

string dajNazov(){ return aNazov; };
Sala* dajSalu(){ return &aSala; };
};

Film.cpp — Фильм

#include "Film.h"using namespace std;

Film::Film(string paNazov){
aNazov = paNazov;

}

Film::Film(void){
aNazov = "Neuvedeny";
}

Film::~Film(){

}

Sala.h — это зал в кино

#pragma once
#include <string>
#include <iostream>
#include "Rad.h"using namespace std;

class Sala
{
private:
static const int aMaxPocetRadov = 10;
Rad* aRady;
string aNazov;

public:
Sala(string paNazov);
Sala(void);
~Sala(void);

void vytvorSalu();
void nastavNazov(string paNazov){ aNazov = paNazov; };
void vypisRady();

Rad *dajRad(int paCislo);
int dajMaxPocetRadov(){ return aMaxPocetRadov; };
string dajNazov(){ return aNazov; };
};

Sala.cpp — Hall.cpp

#include "Sala.h"
Sala::Sala(string paNazov){
aNazov = paNazov;
aRady = new Rad[aMaxPocetRadov];
this->vytvorSalu();
}

Sala::Sala(void){
aNazov = "Neuvedene";
aRady = new Rad[aMaxPocetRadov];
this->vytvorSalu();
}

Sala::~Sala(){
delete [] aRady;
aRady = 0;

}

void Sala::vytvorSalu(){
for(unsigned short int i = 0; i < aMaxPocetRadov; i++)
aRady[i].nastavCisloRadu(i + 1);
}

void Sala::vypisRady(){
Rad* rad;
for(unsigned short int i = 0; i < aMaxPocetRadov; i++){
rad = this->dajRad(i+1);
if(rad != NULL){
cout << rad->toString() << endl;
}
}
}Rad *Sala::dajRad(int paCisloRadu){
if(paCisloRadu > 0 && paCisloRadu <= aMaxPocetRadov){
return &aRady[paCisloRadu-1];
}

return NULL;
}

Тем не менее, это не все. Если это не поможет, я отправлю другие 3 последних класса

С уважением Радован
Привет из Словакии

0

Решение

Одной из основных проблем с вашим кодом является отсутствие правильного copy-ctor. Чтобы проверить это, добавьте

Kino( const Kino& ) = delete;

в ваш класс. Это покажет вам, где сделана копия. Почему это проблема? Потому что автоматически сгенерированный по умолчанию copy-ctor (в случае, если вы не добавите что-то подобное вышеописанному или настоящий copy-ctor) будет копировать указатель на выделенные фильмы. Но теперь у вас есть два экземпляра. Когда первый экземпляр Kino удаляется, вызывает delete[] aFilmy; и второй экземпляр теперь имеет указатель, указывающий на уже удаленную память. Когда второй экземпляр удаляется, он пытается освободить блок памяти снова — и это то, что вызывает проблему для вас.

Вы должны удалить copy-ctor (и оператор присвоения) с помощью

Kino( const Kino& ) = delete;
void operator=( const Kino& ) = delete;

или определите их и убедитесь, что вы создали правильную копию данных.

Увидеть Правило Пяти (ранее правило трех).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]