Russian Qt Forum

Программирование => С/C++ => Тема начата: Caduceus от Июль 22, 2010, 10:07



Название: Переопределен openator new и operator delete - падает в Qt
Отправлено: Caduceus от Июль 22, 2010, 10:07
Вопрос не по Qt, а по переопределнным new и delete

У меня есть сторонный графический движок — я его прикрутил к своей проге на Qt как виджет на уровне исходников (не как сторонняя либа). Так вот — в этом графичесом движке переопределны операторы new и delete

И вот в какой-то момент стало падать на operator delete из этого движка, причем этот опретор вызывается из деструктора QList. А падает потому, что этот двигловый delete говорит, что память выделена не через его new.

Вот и вопрос по С++ — как разрулить-то? Как сделать, что если юзается не мой new, то и delete не мой надо юзать?


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Wlad_C от Июль 22, 2010, 10:43
Переопределение операций может быть глобальным, а может относится только к определенному классу. Тебе надо изменить текст так, чтобы переопределение new и delete относилось только к классу графического двржка.


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Caduceus от Июль 22, 2010, 11:10
А можно к неймспейсу?
А можно как-то инклюды хидеров попробовать попереставлять местами? Или это не поможет?

То есть не может быть такого что new берется откуда-то из недр Qt, а delete на этот объект мой - переопределенный?


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Wlad_C от Июль 22, 2010, 15:07
Qt, насколько мне известно, new и delete не переопределяет. Это операторы С++. А вот последовательность загрузким заголовочных файлов играет большую роль.


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Igors от Июль 22, 2010, 16:47
И вот в какой-то момент стало падать на operator delete из этого движка, причем этот опретор вызывается из деструктора QList. А падает потому, что этот двигловый delete говорит, что память выделена не через его new.
Полагаю/возможно что выделена-то через "его", но затем QList вызывает realloc (qrealloc) который изменит адрес блока. Можно попробовать заменить qrealloc на последовательность new/memmove/delete


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Caduceus от Июль 22, 2010, 22:34
Нет, дело не в realloc

Я не понимаю ничего. Он действительно не заходит в new, но в деструкторе лезет в delete. Это все у QPolygonF - элемент QList

Причем до этого самого QList-а он заходит в переопределнный new
Это что ж значит - внутри QList или QPoligonF есть выделения памяти через malloc, а освобождения через delete???



Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Igors от Июль 23, 2010, 11:49
Нет, дело не в realloc
А откуда такая уверенность? Ваше дальнейшее изложение под realloc подходит хорошо


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Caduceus от Июль 23, 2010, 14:04
Не знай... Запутался я уже... Вот смотрте. Есть элементарный код:
Код:
static void MyDraw(QPainter *painter, const QPainterPath &path)
{
    QList<QPolygonF> bevel = path.toSubpathPolygons(scaleUp);
    Q_FOREACH (QPolygonF polygon, bevel) {
                 ..   ///  тут мы хитро все отрисовываем, это не столь важно 
        }
    }
}

Падает все на выходе из этой функции на деструкторе QList, а точнее на деструкторе QPolygonF - то есть оттуда вызывается мой delete.  НО!!!!  Послле захода в эту функцию НИ РАЗУ не вызывается мой new - то есть в конструкторах QPolygonF мой new не вызывается, а в деструкторе вызывается мой delete - поэтмоу вот и падает. Как быть - не пойму...


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Sancho_s_rancho от Июль 23, 2010, 14:19
Каждому, кто переопределяет new/delete  на каждый пук необходимо отрубать руки. Верните все к дефолтной связке new/delete.


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Caduceus от Июль 23, 2010, 14:29
Да не я это так захотел. Движок графический так делает. А я его прикрутил as is
Я могу конечно убить те переопределния в движке.. Но вообще-то они нормаьные, на этом движке куча игр сделано - и все работает - поэтмоу не думаю, что эти переопределения кривые


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: niXman от Июль 23, 2010, 14:37
Цитировать
на этом движке куча игр сделано
что за движек?


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Igors от Июль 23, 2010, 14:38
Падает все на выходе из этой функции на деструкторе QList, а точнее на деструкторе QPolygonF - то есть оттуда вызывается мой delete.  НО!!!!  Послле захода в эту функцию НИ РАЗУ не вызывается мой new - то есть в конструкторах QPolygonF мой new не вызывается, а в деструкторе вызывается мой delete - поэтмоу вот и падает. Как быть - не пойму...
деструктор QPolygonF - это деструктор QVector, Увы, QVector может использовать просто malloc (qmalloc) вместо new (см. исходники). Надо отключать переопределение new/delete в движке - напр устанавливать флажок перед каждым вызовом движка и затем сбрасывать. Отключить вообще - было бы намного проще но может не получиться.


Название: Re: Переопределен openator new и operator delete - падает в Qt
Отправлено: Caduceus от Июль 23, 2010, 14:41
2 niXman
http://www.terathon.com/c4engine/shots.php (http://www.terathon.com/c4engine/shots.php)

2 Igors
Да :( К сожалению я тоже пришел к такому выводу. Поэтому и спрашивал тут - мож есть какой-то выход стандартный, что-то типа #undef только для new-delete