+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
// Определение метода Q3CanvasText::text()
class Q_COMPAT_EXPORT Q3CanvasText : public Q3CanvasItem {
//...
QString text() const;
//...
};
// Далее уже в "моем" классе строчка:
class CDevice : public CDiagramObject {
// ...
private:
Q3CanvasText * m_pTitle;
//....
public:
const QString & stitle() const { return m_pTitle->text(); } // обратим вниманиена возвращаемый тип
// ...
};
// Еще один класс и отображение тултипа при наведении
void CDiagramView::showToolTip( const QPoint & p, CDevice * d ) {
if( d ) {
QString tmp;
if( d->group() == QString::null || d->group() == "" )
tmp = ( d->stitle().left( d->stitle().indexOf(":") ) ); // вылетало здесь : d->stitle().indexOf(":") segmentation fault
else
tmp = d->group();
//.....
}
}
Нашел магию!
Юзаю Qt 4.8.6 в Linux
Под Виндой новая версия перепиливаемой проги компилится и работает,
под Линухом новая версия вылетает, старая робит.
Соль в том, что метод stitle() по факту возвращает ссылку на копию текста возвращенного Q3CanvasText::text(), которая внезапно удаляется при выходе из метода.
Но почему тот же gcc под виндой скомпилил это без багов?
Запостил: OlegUP,
03 Февраля 2016
OlegUP 03.02.2016 17:22 # −1
bormand 03.02.2016 17:35 # +6
UB же. Самая подлость в том, что UB'ы иногда работают. Другое соглашение о вызовах было, другая глубина стека, другие оптимизации... Вот и повезло, что не затёрлись данные, когда под виндой запустил.
> const QString &
Дооптимизировались, блять. Походу, раньше поле было просто QString'ом. И ссылку возвращали ради оптимизации, чтобы не копировалось. А потом тип у поля поменяли, а у функции - забыли.
bormand 03.02.2016 17:45 # +1
Elvenfighter 03.02.2016 21:17 # −1
Но в этом случае, правда, и ситуация немного другая выходит: this (неявный аргумент) должен жить и после вызова метода
Abbath 03.02.2016 20:45 # +2
roman-kashitsyn 03.02.2016 20:48 # +4
Antervis 04.02.2016 06:55 # +4
bormand 03.02.2016 17:39 # 0
OlegUP 04.02.2016 08:43 # 0
Antervis 04.02.2016 06:42 # +1
"This class is part of the Qt 3 support library. It is provided to keep old source code working. We strongly advise against using it in new code. See Porting to Qt 4 for more information."
OlegUP 04.02.2016 08:44 # 0
> Под Виндой новая версия перепиливаемой проги