Завдання 17 Дедлайн 18 січня

в

Задана програма повинна вивести 10 разів наступну пару:

Point
Bytestream

Проте програма завершує роботу з помилкою набагато раніше (“вилітає”).
Знайдіть і виправте причину раптового завершення роботи.

#include <iostream>

struct Named {
   virtual const char* name() const {
       return "Named";
   }
};

struct Point : public Named {
   int x;
   int y;

   virtual const char* name() const {
       return "Point";
   }
};

struct ByteStream : public Named {
   char* data;

   ByteStream() {
       data = new char[1024 * 1024]{"\0"};
   }

   virtual ~ByteStream() {
       delete[] data;
   }

   virtual const char* name() const {
       return "ByteStream";
   }
};

int main() {
   Named* o1 = nullptr;
   Named* o2 = nullptr;
   for (int i = 0; i < 100000; ++i) {
       o1 = new Point();
       o2 = new ByteStream();
       if ((i + 1) % 10000 == 0) {
           std::cout << o1->name() << std::endl;
           std::cout << o2->name() << std::endl;
           std::cout << std::endl;
       }
       delete o1;
       delete o2;
   }
   return 0;
}

Відповідь:

Деструктор Named оголошений неявно, а отже не є віртуальним. Незважаючи на те, що деструктор ByteStream віртуальний, delete o2 все одно викликає лише деструктор класу Named, через що на кожній ітерації втрачається 1 мегабайт оперативної пам’яті, виділеної під поле data класу ByteStream. Система примусово завершує процес, щоб запобігти більш критичним наслідкам. Виправити помилку можна додавши визначення віртуального деструктора в Named:

struct Named {
   virtual ~Named() = default;

   virtual const char* name() const {
       return "Named";
   }
};

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 1 ГБ. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Перетащите файл сюда