gpt4 book ai didi

C++ 调试断言失败,表达式 : _BLOCK_TYPE_IS_VALID(pHead - blockUse )

转载 作者:行者123 更新时间:2023-11-28 07:20:32 25 4
gpt4 key购买 nike

我正在编写一个类似于电影信息系统的程序。我是 C++ 的初学者。

每次编译后我都会收到此错误警报消息。我确信在 detructor 调用时它会出错。

我阅读了很多与此错误相关的帖子。但我还是忍不住。我还有其他类(class),但我不认为那里有错误。因为当我在析构函数中注释内容时,编译后没有任何错误。如果您需要,我会在我的项目中发布其他类的代码。

如果可以请帮帮我。感谢您的愿意和帮助。

这是我的类代码,它出错了。对不起我糟糕的英语

头文件

#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 个最后的类(class)

最好的问候拉多万来自斯洛伐克的问候

最佳答案

您的代码的一个主要问题是缺少合适的复制构造函数。要对此进行测试,请添加

Kino( const Kino& ) = delete;

到你的类(class)。这将向您显示复制的位置。为什么这是个问题?因为自动生成的默认 copy-ctor(如果你不添加类似上面的内容或真正的 copy-ctor)会将指针复制到分配的电影。但是你现在有两个实例。当 Kino 的第一个实例被删除时,它调用 delete[] aFilmy; 并且第二个实例现在有一个指向已删除内存的指针。当第二个实例被删除时,它会尝试释放内存块再次 - 这就是导致您出现问题的原因。

您应该删除复制构造函数(和赋值运算符)

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

或定义它们并确保创建正确的数据拷贝。

参见 Rule of Five (以前称为三法则)。

关于C++ 调试断言失败,表达式 : _BLOCK_TYPE_IS_VALID(pHead - blockUse ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19552469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com