Russian Qt Forum
Октябрь 05, 2024, 16:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Переопределен openator new и operator delete - падает в Qt  (Прочитано 6723 раз)
Caduceus
Гость
« : Июль 22, 2010, 10:07 »

Вопрос не по Qt, а по переопределнным new и delete

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

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

Вот и вопрос по С++ — как разрулить-то? Как сделать, что если юзается не мой new, то и delete не мой надо юзать?
Записан
Wlad_C
Гость
« Ответ #1 : Июль 22, 2010, 10:43 »

Переопределение операций может быть глобальным, а может относится только к определенному классу. Тебе надо изменить текст так, чтобы переопределение new и delete относилось только к классу графического двржка.
Записан
Caduceus
Гость
« Ответ #2 : Июль 22, 2010, 11:10 »

А можно к неймспейсу?
А можно как-то инклюды хидеров попробовать попереставлять местами? Или это не поможет?

То есть не может быть такого что new берется откуда-то из недр Qt, а delete на этот объект мой - переопределенный?
« Последнее редактирование: Июль 22, 2010, 11:13 от Caduceus » Записан
Wlad_C
Гость
« Ответ #3 : Июль 22, 2010, 15:07 »

Qt, насколько мне известно, new и delete не переопределяет. Это операторы С++. А вот последовательность загрузким заголовочных файлов играет большую роль.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июль 22, 2010, 16:47 »

И вот в какой-то момент стало падать на operator delete из этого движка, причем этот опретор вызывается из деструктора QList. А падает потому, что этот двигловый delete говорит, что память выделена не через его new.
Полагаю/возможно что выделена-то через "его", но затем QList вызывает realloc (qrealloc) который изменит адрес блока. Можно попробовать заменить qrealloc на последовательность new/memmove/delete
Записан
Caduceus
Гость
« Ответ #5 : Июль 22, 2010, 22:34 »

Нет, дело не в realloc

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

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

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 23, 2010, 11:49 »

Нет, дело не в realloc
А откуда такая уверенность? Ваше дальнейшее изложение под realloc подходит хорошо
Записан
Caduceus
Гость
« Ответ #7 : Июль 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 - поэтмоу вот и падает. Как быть - не пойму...
Записан
Sancho_s_rancho
Гость
« Ответ #8 : Июль 23, 2010, 14:19 »

Каждому, кто переопределяет new/delete  на каждый пук необходимо отрубать руки. Верните все к дефолтной связке new/delete.
Записан
Caduceus
Гость
« Ответ #9 : Июль 23, 2010, 14:29 »

Да не я это так захотел. Движок графический так делает. А я его прикрутил as is
Я могу конечно убить те переопределния в движке.. Но вообще-то они нормаьные, на этом движке куча игр сделано - и все работает - поэтмоу не думаю, что эти переопределения кривые
Записан
niXman
Гость
« Ответ #10 : Июль 23, 2010, 14:37 »

Цитировать
на этом движке куча игр сделано
что за движек?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июль 23, 2010, 14:38 »

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

2 niXman
http://www.terathon.com/c4engine/shots.php

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


Страница сгенерирована за 0.045 секунд. Запросов: 23.