2013-10-23 69 views
0

我正在寫一個程序什麼是電影信息系統。我是C++的起源者。C++調試斷言失敗,表達式:_BLOCK_TYPE_IS_VALID(pHead - blockUse)

每次編譯後,我都會收到此錯誤警報消息。我相信當析構函數調用時它會出錯。

我讀了很多與這個錯誤有關的帖子。但我仍然無法幫助。我有另一個班,但我不認爲那裏有錯誤。因爲當我在析構函數中註釋內容時,編譯後沒有任何錯誤。如果你需要,我會在我的項目中發佈其他類的代碼。

請幫助我,如果你可以。感謝您的支持和幫助。

這是我的錯誤代碼。對不起,我糟糕的英國

頭文件

#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類

問候拉多萬· 問候來自斯洛伐克

與您的代碼
+0

你有時會混淆上面的「電影」和「電影」,更好地複製/粘貼你的真實代碼。如果我將「電影」替換爲「電影」,上述內容不包含任何錯誤 - 這意味着問題出在您未向我們展示的代碼中。添加'Movie.h'和'Movie.cpp',也可能是'main'的測試代碼。 –

+0

所以,okey,但我會添加我的原代碼,因爲我必須將我的屬性,方法,參數翻譯成英文。原始代碼在斯洛伐克,我希望你不會有問題。謝謝 – vanrado

回答

0

的一個主要問題是缺乏合適的拷貝構造函數的。要測試此功能,請將

Kino(const Kino&) = delete; 

添加到您的班級。這會告訴你在哪裏複製。爲什麼這是個問題?因爲自動生成的默認拷貝文件(如果你沒有添加類似上述內容或真正的拷貝文件)會將指針拷貝到分配的電影中。但是你現在有兩個實例。當Kino的第一個實例被刪除時,它調用delete[] aFilmy;,第二個實例現在有一個指向已經刪除的內存的指針。當第二個實例被刪除時,它會嘗試釋放內存塊再次 - 這就是導致你的問題。

你應利用

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

刪除拷貝構造函數(和分配新建分配FY-運營商)或定義它們,並確保您所創建的數據的正確副本。

查看Rule of Five(原爲三大法則)。

+0

感謝您快速回答。我很抱歉,但我忘記只在本報告中寫上括號。我嚴格檢查了我的信息,但是我的程序中包含了它。 – vanrado

+0

我希望你看到我的答案。我現在正在研究更多關於動態分配內存和copyconstructors的內容。我希望我能用我的語言找到解釋,你在說什麼。 – vanrado