Как gcc / g ++ справляется с этим?
Он обрабатывает это, как вы можете видеть из ваших испытаний.
Хотя это рискованно: например, если вы изменили метод dev
для доступа к любым данным члена экземпляра класса Foo, то ваше поведение (т. Е. Вызов метода dev
после удаления экземпляра Foo) будет недопустимым. и поведение будет неопределенным: фактическое поведение будет варьироваться в зависимости от того, что происходило в другом месте программы, например, от того, была ли перераспределена память, которую занимал экземпляр Foo (и которая была освобождена при удалении экземпляра Foo) другая тема.
Поведение также было бы другим, если бы метод dev
был виртуальным, а Foo был базовым классом или подклассом в иерархии наследования.
Было бы лучше, если бы вы определили dev
как статический метод:
class Foo {
public:
Foo(char x);
Foo(char x, int y);
~Foo();
void abc();
static void dev();
};
Если вы вызываете функцию, которая не может быть определена как статическая (потому что она виртуальная или потому что она обращается к данным члена экземпляра), то делать то, что вы делали, было бы незаконно.