Удаление элементов массива указателей на базовый класс

157
26 июня 2022, 11:30

У меня базовый класс с двумя виртуальными методами и два класса-наследника. В функции main есть массив указателей на базовый класс, который может так же содержать указатели на объекты дочерних классов. В целом всё в программе не полохо до попытки очистить память, выделенную под элементы массива. При попытке использовать delete программа крашится и выдаёт ошибку сегментации

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
////////////////////////////////////////////////////////////////////////////////
class publication           // базовый класс
{
private:
    string name;
    float price;
public:
    publication() : name("N/A"), price(0.0)
    {}
    publication(string n, float p) : name(n), price(p)
    {}
    virtual void getdata()  // те самые виртуальные методы
    {
        cout << "\nВведите название книги: "; cin >> name;
        cout << "Введите цену: "; cin >> price;
    }
    virtual void putdata()
    {
        cout << "\nНазвание: " << name;
        cout << "\nЦена: " << price;
    }
    virtual ~publication()  // виртуальный деструктор (текст выводил для отладки, но это не помогло опреденить проблему)
    {cout << "publication destructor" << endl;}
};
////////////////////////////////////////////////////////////////////////////////
class book : public publication
{
private:
    int pages;
public:
    book() : publication(), pages(0)
    {}
    book(string n, float p, int pa) : publication(n, p), pages(pa)
    {}
    void getdata()
    {
        publication::getdata();
        cout << "\nВведите количество страниц: "; cin >> pages;
    }
    void putdata()
    {
        publication::putdata();
        cout << "\nКоличество страниц: " << pages;
    }
    ~book()
    {cout << "book destructor" << endl;}
};
////////////////////////////////////////////////////////////////////////////////
class tape : public publication
{
private:
    float rectime;
public:
    tape() : publication(), rectime(0.0)
    {}
    tape(string n, float p, float rec) : publication(n, p), rectime(rec)
    {}
    void getdata()
    {
        publication::getdata();
        cout << "Введите время записи: "; cin >> rectime;
    }
    void putdata()
    {
        publication::putdata();
        cout << "\nВремя записи: " << rectime;
    }
    ~tape()
    {cout << "tape destructor" << endl;}
};
////////////////////////////////////////////////////////////////////////////////
int main()
{
    publication* pubptr[10];
    char choice;
    int pubtype;
    int lenofarr = 0;
    for(int i = 0; i < 10; i++)             // ввод значений в массив
    {
        cout << "Выберете тип публикации (1 - book; 2 - tape)";
        cin >> setw(4) >> pubtype;
        switch(pubtype)
        {
            case 1: pubptr[i] = new book; break;
            case 2: pubptr[i] = new tape; break;
            default: cout << "Не верно" << endl;
        }
        pubptr[i]->getdata();
        lenofarr++;
        cout << "Хотите продолжить?(y/n): ";
        cin >> choice;
        if(choice != 'y')
            break;
    }
    for(int i = 0; i < 100; i++)        // вывод содержимого массива
    {
        pubptr[i]->putdata(); cout << endl;
    }
    for(int i = 0; i < lenofarr; i++)   // удаление элементов
        delete pubptr[i];
    return 0;
}
READ ALSO
Расширение массива в cpp

Расширение массива в cpp

Возможно ли реализовать реализовать именно расширение памяти? Или хотя бы при помощи манипуляций с указателями избежать лишнего копирования...

215
Где правильно требуется поставить скобки в выражении? с++ [закрыт]

Где правильно требуется поставить скобки в выражении? с++ [закрыт]

Скорее всего, данный вопрос не соответствует тематике Stack Overflow на русском, согласно правилам описанным в справке

165
Проблема с генератором чисел

Проблема с генератором чисел

У меня есть массив и я его изменил алгоритмом Фишера-ЙетсаПроблема заключается в том, что у меня числа в измененном массиве начинаются с нуля,...

270
Печать массива с отступом

Печать массива с отступом

Всем здравствуйтеТакая проблема: печатается только первый элемент с отступом, а все остальные без отступа

164