Название: Переопределен 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 - то есть оттуда вызывается мой 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 |