Задана програма повинна вивести 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";
}
};
Добавить комментарий