0

映画の情報システムのようなプログラムを書いています。私はC++の初心者です。

コンパイルするたびに、このエラー警告メッセージが表示されます。デトラクターが呼び出しているときにエラーが発生していると確信しています。

このエラーに関連する多くの投稿を読みました。しかし、私はまだ助けることができません。別のクラスがありますが、エラーはないと思います。デストラクタでコンテンツにコメントを付けると、コンパイル後にエラーが発生しないためです。必要に応じて、プロジェクトに別のクラスのコードを投稿します。

できれば助けてください。どうぞよろしくお願いいたします。

これは、エラーが発生しているクラスの私のコードです。私のひどい英語でごめんなさい

ヘッダファイル

#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つのクラスを投稿します

よろしく ラドヴァン スロバキアからのご挨拶

4

1 に答える 1

1

コードの大きな問題の 1 つは、適切な copy-ctor がないことです。これをテストするには、追加します

Kino( const Kino& ) = delete;

あなたのクラスに。これにより、コピーが作成された場所が表示されます。なぜこれが問題なのですか?自動的に生成されたデフォルトの copy-ctor (上記のようなものまたは実際の copy-ctor を追加しない場合) は、割り当てられたフィルムへのポインターをコピーするためです。しかし、これで 2 つのインスタンスができました。の最初のインスタンスKinoが削除されると、それが呼び出さdelete[] aFilmy;れ、2 番目のインスタンスは既に削除されたメモリを指すポインターを持ちます。2 番目のインスタンスが削除されると、メモリ ブロックを再度解放しようとします。これが問題の原因です。

次のコマンドを使用して、copy-ctor (および assigment-operator) を削除する必要があります。

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

またはそれらを定義して、データの適切なコピーを作成してください。

5のルール(以前の 3のルール) を参照してください。

于 2013-10-23T21:19:59.747 に答える