【问题标题】:C++ Debug Assertion Failed, Expression: _BLOCK_TYPE_IS_VALID(pHead - blockUse )C++ 调试断言失败,表达式:_BLOCK_TYPE_IS_VALID(pHead - blockUse)
【发布时间】:2013-10-23 21:17:19
【问题描述】:

我正在编写一个类似于电影信息系统的程序。我是 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 文件

#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 个最后的课程

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

【问题讨论】:

  • 您有时会在上面混淆“电影”和“电影”,最好复制/粘贴您的真实代码。如果我将“电影”替换为“电影”,则上述内容不包含任何错误 - 这意味着问题出在您未向我们展示的代码中。添加Movie.hMovie.cpp 以及来自main 的测试代码。
  • 所以,好的,但我会添加我的原始代码,因为我必须将我的属性、方法、参数翻译成英文。原始代码是斯洛伐克语,我希望你不会有问题。谢谢

标签: c++ visual-studio-2010 visual-studio-2012 c++11 assertions


【解决方案1】:

您的代码的一个主要问题是缺少适当的复制器。要对此进行测试,请添加

Kino( const Kino& ) = delete;

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

您应该删除复制ctor(和分配运算符)

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

或定义它们并确保创建正确的数据副本。

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

【讨论】:

  • 感谢您的快速答复。很抱歉,我忘了只为这份报告写括号。我错误地检查了我的消息,但我的程序中有它。
  • 希望你能看到我的回答。我现在正在研究更多关于动态分配内存和复制构造函数的信息。我希望我能用我的语言找到解释,你在说什么。
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2013-11-10
相关资源
最近更新 更多