переопределен openator new и operator delete - падает в Qt
От: Аноним  
Дата: 22.07.10 07:04
Оценка:
Вопрос не по Qt, а по переопределнным new и delete — поэтому сюда

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

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

Вот и вопрос по С++ — как разрулить-то? Как сделать, что если юзается не мой new, то и delete не мой надо юзать?
Re: переопределен openator new и operator delete - падает в
От: K13 http://akvis.com
Дата: 22.07.10 08:01
Оценка:
А>У меня есть сторонный графический движок — я его прикрутил к своей проге на Qt как виджет на уровне исходников (не как сторонняя либа). Так вот — в этом графичесом движке переопределны операторы new и delete

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


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


Выкинуть из графического движка переопределения new / delete.
Это очень плохой дизайн либы — либа должна работать с тем менеджером, который ей подсунет программист, а не навязывать свой.
Возможно, кривизна еще и в самом переопределении -- как минимум, у меня несколько лет с разными версиями Qt жил свой менежер памяти, и она ни разу на это не обижалась
Например, забыли переопределить вариант с nothrow_t или еще что-нибудь.
Re[2]: переопределен openator new и operator delete - падает
От: Аноним  
Дата: 22.07.10 08:12
Оценка:
Здравствуйте, K13, Вы писали:

K13>Выкинуть из графического движка переопределения new / delete.

K13>Это очень плохой дизайн либы — либа должна работать с тем менеджером, который ей подсунет программист, а не навязывать свой.
K13>Возможно, кривизна еще и в самом переопределении -- как минимум, у меня несколько лет с разными версиями Qt жил свой менежер памяти, и она ни разу на это не обижалась
K13>Например, забыли переопределить вариант с nothrow_t или еще что-нибудь.

То есть не может быть такого что new берется откуда-то из недр Qt, а delete на этот объект мой — переопределенный?
Re: переопределен openator new и operator delete - падает в
От: Кодт Россия  
Дата: 22.07.10 09:03
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А поискать, кто именно и где именно создаёт объект?


Ещё может быть такая фигня, что у базового класса невиртуальный деструктор, а у наследованного — собственные операторы new/delete.
Тогда delete (Base*) new Derived() приведёт к трагедии:
— невызов деструктора Derived (это уже само по себе UB)
— вызов Base::operator delete (или глобального) — поскольку именно деструктор отвечает за вызов правильного оператора, см.выше (а вот и плоды этого UB)



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


boost::shared_ptr<Base> вместе с указателем на объект Derived* запоминает и функцию удаления (по умолчанию — это checked_delete<Derived> в данном модуле).
Это позволяет безболезненно передавать указатели через границы DLL со статически прилинкованными персональными менеджерами памяти.
Перекуём баги на фичи!
Re: переопределен openator new и operator delete - падает в
От: McSeem2 США http://www.antigrain.com
Дата: 24.07.10 15:17
Оценка: -1
Здравствуйте, Аноним, Вы писали:

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


Кошмар! Глобально переопределять new — это полное ламерство. Надо лечитиь движок.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: переопределен openator new и operator delete - падает
От: Аноним  
Дата: 24.07.10 15:35
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Кошмар! Глобально переопределять new — это полное ламерство. Надо лечитиь движок.


Да нет, не движок кривой, а Qt — выделяет память через malloc, а удаляет через delete
Re[3]: переопределен openator new и operator delete - падает
От: BogusCoder Швеция  
Дата: 29.07.10 08:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Да нет, не движок кривой, а Qt — выделяет память через malloc, а удаляет через delete


Ересь! покажите где они это делают?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.