![](/img/trans.png)
[英]Debug Assertion Failed _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
[英]C++ Debug Assertion Failed, Expression: _BLOCK_TYPE_IS_VALID(pHead - blockUse )
我正在写一个程序,就像电影院的信息系统。 我是C ++的入门者。
每次编译后,我都会收到此错误警报消息。 我确定在调用trutructor时出现错误。
我读了很多与此错误有关的帖子。 但是我还是忍不住。 我还有另外一堂课,但我不认为有错误。 因为当我注释析构函数中的内容时,编译后没有任何错误。 如果您需要,我将在我的项目中发布另一个类的代码。
如果可以,请你帮助我。 感谢您的愿意和协助。
这是我的类代码在哪里出错。 对不起,我的英语不好
头文件
#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文件
#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个最后的课程
最好的问候斯洛伐克拉多万问候
您的代码的一个主要问题是缺少适当的copy-ctor。 要对此进行测试,请添加
Kino( const Kino& ) = delete;
上你的课。 这将显示复制的位置。 为什么这是个问题? 因为自动生成的默认copy-ctor(以防您不添加上述内容或真实的copy-ctor)会将指针复制到分配的电影。 但是您现在有两个实例。 删除Kino
的第一个实例时,它将调用delete[] aFilmy;
现在,第二个实例具有一个指向已删除内存的指针。 删除第二个实例后,它将尝试再次释放内存块-这就是造成您问题的原因。
您应该使用以下命令删除copy-ctor(和assigment-operator)
Kino( const Kino& ) = delete;
void operator=( const Kino& ) = delete;
或定义它们,并确保您创建数据的正确副本。
参见五法则 (以前称为三法则)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.