Я использую виртуальное наследование с выбором классов в C++. В настоящее время он разрушается при уничтожении. Кажется, он компилируется в онлайн-компиляторах, однако, когда я запускаю Visual Studio, он сбой.Размещение нового сбоя при использовании с виртуальной иерархией наследования в Visual C++
У меня есть чистый виртуальный базовый класс, который унаследован практически благодаря его реализации. Затем у меня есть третий класс, который наследуется от реализации регулярно. Я использую внутреннюю систему для создания и освобождения памяти. Под капотом используется новое место размещения с выровненным malloc. Затем он освобождает память. Я создал этот минимальный пример. Это не совсем то, что я делаю, но похоже, что у меня подобная проблема.
#include <iostream>
#include <string>
int main()
{
class Animal {
public:
Animal() { }
virtual ~Animal() { }
virtual void eat() { }
};
class Mammal : public virtual Animal {
public:
virtual void breathe() { }
};
class WingedAnimal : public virtual Animal {
public:
virtual void flap() { }
};
// A bat is a winged mammal
class Bat : public Mammal, public WingedAnimal {
};
Animal* bat = new(malloc(sizeof(Bat))) Bat;
bat->~Animal();
free(bat);
printf("Done!");
}
Как я уже сказал, этот пример напечатает «Готово» в онлайн-компиляторе. Однако в Visual Studio 2015 он, похоже, падает без объекта bat. Я довольно новичок в виртуальном наследовании и размещении нового. Кто-нибудь видит проблему?
@Barry http://cpp.sh/2vd4t предоставляет именно то, что ... вставляем визуальную студию, и у вас есть проблема. Вот он-лайн, который вы можете использовать: http://webcompiler.cloudapp.net/. Насколько я вижу этот ответ почти на всех моих вопросах. Возможно, вы могли бы указать на то, чего не хватает, чтобы я мог улучшить в будущем? – marsh
Проводка ссылок на код не рекомендуется. Почтовый код в самом вопросе. –
@jeff Он использует синтаксис размещения, поэтому malloc просто выделяет необработанную память; new инициализирует его как объект C++. Затем он явно называет деструктора и звонит бесплатно. Это законно. И производные классы всегда имеют виртуальный деструктор, когда они наследуют класс, который имеет один. –