Я получаю ошибку Abort (core dumped) при попытке скомпилировать код - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть четыре части этого кода. Один из них - это класс DVD, а остальные - HarryPotterDVD.h, HarryPotterDVD.cpp и HarryPotterDVDDriver.cpp. Когда я компилирую код, он компилируется без каких-либо ошибок, но когда я пытаюсь запустить скомпилированный исполняемый файл, я получаю ошибку Abort (core dumped). Я думаю, что это из-за того, как я использовал унаследованные функции. Не могли бы вы, ребята, помочь мне выяснить, как решить проблему.

DVD.cpp

#include "DVD.h"

DVD::DVD() {
    id =0;
    title = new char[1];
    title[0] = '\0';
    director = new char[1];
    director[0] = '\0';
}

DVD::DVD(unsigned int i, const char* t, const char* dir) {
    id = i;
    int len;
    for(len = 0; t[len] !='\0'; ++len);
    title = new char[len+1];
    for(int i = 0; i < len+1; i++) {title[i]=t[i];}

    int len2;
    for(len2=0; dir[len2] !='\0'; ++len2);
    director = new char[len2+1];
    for(int j = 0; j<len2+1; j++) {director[j] = dir[j];}
}

DVD::DVD(const DVD &d): id(d.id) {
    int len;
    for(len=0; d.title[len] !='\0'; ++len);
    title = new char[len+1];
    for(int j = 0; j < len+1; j++) {
        title[j] = d.title[j];
    }

    int len2;
    for(len2=0; d.director[len2] != '\0'; ++len2);
    director = new char[len2+1];
    for(int j = 0; j<len2 +1; j++) {
        director[j] = d.director[j];
    }
}

DVD::~DVD() {
    if (title) {
        delete [] title;
    }
    if (director) {
        delete [] director;
    }
}

int DVD::getID() {
    return id;
}

char* DVD::getTitle() {
    return title;
}

char* DVD::getDirector() {
    return director;
}

void DVD::display() {
    cout << '[' << id << '.' << ' ' << title << '/' << director << ']' << endl;
}

void DVD::setID(unsigned int i) {
    id = i;
}

void DVD::setTitle(const char* t) {
    delete [] title;
    int len;
    for(len = 0; t[len] !='\0'; ++len);
    title = new char[len+1];
    for(int i = 0; i < len+1; i++) {title[i]=t[i];}
}

void DVD::setDirector(const char* dir) {
    delete [] director;
    int len2;
    for(len2=0; dir[len2] !='\0'; ++len2);
    director = new char[len2+1];
    for(int j = 0; j<len2+1; j++) {director[j] = dir[j];}    
}

DVD& DVD::operator= (const DVD& arg) {
    id = arg.id;

    int len;
    for(len = 0; arg.title[len] !='\0'; ++len);
    title = new char[len+1];
    for(int i = 0; i < len+1; i++) {title[i]=arg.title[i];}

    int len2;
    for(len2=0; arg.director[len2] !='\0'; ++len2);
    director = new char[len2+1];
    for(int j = 0; j<len2+1; j++) {director[j] = arg.director[j];}  
    return *this;
}

HarryPotterDVD.h

#ifndef _HarryPotterDVD_
#define _HarryPotterDVD_
#include<iostream>
#include "DVD.h"
using namespace std;

class HarryPotterDVD : public DVD {
        int episode;
        char * antagonist;
    public:
        HarryPotterDVD(unsigned int i, char* t, char* dir, int n, char* ant);
        HarryPotterDVD();
        HarryPotterDVD(HarryPotterDVD& d);
        ~HarryPotterDVD();
        int getEpisode();
        char* getAntagonist();
        void display();
        void setEpisode(unsigned int e);
        void setAntagonist(const char* c);
        HarryPotterDVD& operator= (HarryPotterDVD& arg);
};
#endif

HarryPotterDVD.cpp

#include "HarryPotterDVD.h"
#include<iostream>
using namespace std;

HarryPotterDVD::HarryPotterDVD(unsigned int i, char* t, char* dir, int n, char* ant): DVD( i , t , dir) {
    episode = n;
    int len;
    for(len = 0; ant[len] !='\0'; ++len);
    antagonist = new char[len+1];
    for(int j = 0; j < len+1; j++) {antagonist[j]=ant[j];}
}

HarryPotterDVD::HarryPotterDVD(HarryPotterDVD &d) {
    DVD::setID(d.DVD::getID());
    DVD::setTitle(d.DVD::getTitle());
    DVD::setDirector(d.DVD::getDirector());
    episode = d.episode;
    int len;
    for(len = 0; d.antagonist[len] != '\0'; len++);
    antagonist = new char[len + 1];
    for(int i = 0; i < len; i++){
        antagonist[i] = d.antagonist[i];
    }
    antagonist[len+1] = '\0';
}

HarryPotterDVD::HarryPotterDVD() {
    episode = -1;
    char* tmp = "";
    antagonist = tmp;
}

HarryPotterDVD::~HarryPotterDVD(){
    delete [] antagonist;
}

int HarryPotterDVD::getEpisode(){
    return episode;
}

char * HarryPotterDVD::getAntagonist(){
    return antagonist;
}

void HarryPotterDVD::display(){
    cout << "[" << DVD::getID() << ". HP" << episode;
    cout << ":" << DVD::getTitle() << "/" << DVD::getDirector();
    cout << "/" << antagonist << "]" << endl; 
}

void HarryPotterDVD::setEpisode(unsigned int e){
    episode = e;
}

void HarryPotterDVD::setAntagonist(const char * c){
    delete [] antagonist;
    int len;
    for(len = 0; c[len] != '\0'; len++);
    antagonist = new char[len + 1];
    for(int i = 0; i < len; i++){
        antagonist[i] = c[i];
    }
    antagonist[len+1] = '\0';
}

HarryPotterDVD& HarryPotterDVD::operator= (HarryPotterDVD &d){
    delete [] antagonist;
    episode = d.episode;

    int len3;
    for(len3 = 0; d.antagonist[len3] != '\0'; len3++);
    antagonist = new char[len3 + 1];
    for(int i = 0; i < len3; i++){
        antagonist[i] = d.antagonist[i];
    }
    antagonist[len3+1] = '\0';
    DVD::operator=(d);
    /*
    setID(d.getID());
    int len;
    for(len = 0; d.getTitle()[len] != '\0'; len++);
    char * tit = new char[len+1];
    for(int i = 0; i < len; i++){
        tit[i] = d.getTitle()[i];
    }
    tit[len] = '\0';
    setTitle(tit);
    int len2;
    for(len2 = 0; d.getDirector()[len2] != '\0'; len2++);
    char* dire = new char[len2+1];
    for(int i = 0; i < len2; i++){
        dire[i] = d.getDirector()[i];
    }
    dire[len2] = '\0';
    setDirector(dire);
    */
    return* this;
}

HarryPotterDVDDriver.cpp

#include<iostream>
using namespace std;
#include"DVD.h"
#include"HarryPotterDVD.h"

int main() {
    HarryPotterDVD h1;
    HarryPotterDVD h2(1, "Chamber of Secrets", "Chris Columbus", 2, "Tom Riddle");
    HarryPotterDVD h3(h2);
    h1 = h3;
    cout << h2.getEpisode() << endl;
    cout << h2.getAntagonist() << endl;
    h3.display();
    h1.setEpisode(5);
    h1.setAntagonist("Prabesh");
    h1.display();
}

1 Ответ

0 голосов
/ 15 апреля 2019

В конструкторе по умолчанию HarryPotterDVD вы назначаете случайный указатель на переменную-член antagonist, которая не создается с помощью new[]

HarryPotterDVD::HarryPotterDVD() {
    episode = -1;
    char* tmp = "";
    antagonist = tmp;
}

В функции operator=(), когда выполняется оператор h1=h3;, вы удаляете antagonist, используя delete[], что вызывает ошибку сегментации.

delete является нулевым. Таким образом, в ваших конструкторах по умолчанию вы можете просто сделать указатели на nullptr, и delete из них во время присваивания не вызовет никаких ошибок. Если вы измените этот путь, ваша проблема должна исчезнуть.

HarryPotterDVD::HarryPotterDVD() {
    episode = -1;
    antagonist = nullptr;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...