Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ced от Май 06, 2017, 11:41



Название: Просветите новичка
Отправлено: Ced от Май 06, 2017, 11:41
Код:
C:\Qt\5.8\mingw53_32\include\QtCore\qlist.h:493: предупреждение: deleting object of polymorphic class type 'Method' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
         while(from != to) --to, delete reinterpret_cast<T*>(to->v);
                               ^

Чего он ко мне привязался?


Название: Re: Просветите новичка
Отправлено: Ced от Май 06, 2017, 12:07
Цитировать
https://habrahabr.ru/post/64280/

Тут прочитал, в чем проблема. Но там не сказано, как правильно.


Название: Re: Просветите новичка
Отправлено: Igors от Май 06, 2017, 12:12
Сообщает что класс Method полиморфный (имеет хотя бы 1 virtual), но деструктор не virtual. Это чревато утечками и др неприятностями, сделайте его виртуальным
Код
C++ (Qt)
class Method {
public:
...
virtual ~Method( void );
};


Название: Re: Просветите новичка
Отправлено: Ced от Май 06, 2017, 19:37
Сообщает что класс Method полиморфный (имеет хотя бы 1 virtual), но деструктор не virtual. Это чревато утечками и др неприятностями, сделайте его виртуальным
Код
C++ (Qt)
class Method {
public:
...
virtual ~Method( void );
};

А содержимое деструктора писать надо, или достаточно объявить?


Название: Re: Просветите новичка
Отправлено: Ced от Май 06, 2017, 22:17
Сообщает что класс Method полиморфный (имеет хотя бы 1 virtual), но деструктор не virtual. Это чревато утечками и др неприятностями, сделайте его виртуальным
Код
C++ (Qt)
class Method {
public:
...
virtual ~Method( void );
};

Спасибо. Вроде разобрался. Компилятор не ругается. Посмотрим, как заработает, когда запущу.


Название: Re: Просветите новичка
Отправлено: __Heaven__ от Май 06, 2017, 22:24
Компоновщик не справится без тела деструктора. Да и в таблицу виртуальных методов непонятно, что записывать напротив деструктора.
Можно попросить компилятор сгенерировать деструктор по умолчанию
Код
C++ (Qt)
class Method {
virtual ~Method() = default;
};
Или дать его определение (пустое тело).


Название: Re: Просветите новичка
Отправлено: Ced от Май 06, 2017, 22:49
Компоновщик не справится без тела деструктора. Да и в таблицу виртуальных методов непонятно, что записывать напротив деструктора.
Можно попросить компилятор сгенерировать деструктор по умолчанию
Код
C++ (Qt)
class Method {
virtual ~Method() = default;
};
Или дать его определение (пустое тело).

Написал деструктор явно. Посмотрю, как будет работать. Если не получится, попробую воспользоваться =defaut