Комментарии 20
Для поиска утечек можно использовать внешние программы: DevPartner Studio, Intel Parallel Inspector. К сожалению ни одна из них не смогла корректно посчитать утечки в C#,C++/CLI, C++ среде.
Можно использовать _CrtSetDbgFlag(), но не удобно с ним работать + проблемы со статическими глобальными переменными.
Visual Leak Detector — не пробывал, надо попробывать.
Еще мы используем nedmalloc, и для этого нам нужны свои глобальные new/delete.
Можно использовать _CrtSetDbgFlag(), но не удобно с ним работать + проблемы со статическими глобальными переменными.
Visual Leak Detector — не пробывал, надо попробывать.
Еще мы используем nedmalloc, и для этого нам нужны свои глобальные new/delete.
Вы не пробовали включать переопределение ваших операторов new/delete то объявления класса Foo?
по-моему, самое место топику — на rsdn.ru, там вам всё в 5 минут растолкуют, здесь-то это зачем?..
запакуйте new && delete операции в C++
new -> Class::create \ cppnew(Class) \…
delele — >Class->die() \ cppdel(Class) \…
либо оберните Class в обертку и делегируйте этот гемор ей.
new -> Class::create \ cppnew(Class) \…
delele — >Class->die() \ cppdel(Class) \…
либо оберните Class в обертку и делегируйте этот гемор ей.
Как я понял ваш совет, он аналогичен просто глобальным функциям MYNEW(...), MYDELETE(...). Но у меня нет возможности поменять все new/delete в проекте на них. Плюс надо чтобы сторонние библиотеки, stl и тд использовали наши переопределенные new/delete
вам надо переопределить использование new&delete на использование функций mynew\mydelete
они обычные функции, которые, в принципе, тоже могут быть вынесены с натив кода.
В дальнейшем из C# можно вызывать new\delete через эти враперы.
Вариант два — зашаблонить new\delete в конструкцию вида
те выехать на тот что класс создается через врапер, алокация которого находиться в cpp и никакие танцы своими переопределениями new\delete не создает
к сожалению не помню точно как использовать malloc и компанию для создания обьекта и его правильной инициализации — слишком давно делал :(
А вообще проблема алокации сложная чтука.
Как-то почти неделю парился с падением сервиса «по памяти» из-за различных значений выравнивания данных в различных использующихся либах
они обычные функции, которые, в принципе, тоже могут быть вынесены с натив кода.
В дальнейшем из C# можно вызывать new\delete через эти враперы.
Вариант два — зашаблонить new\delete в конструкцию вида
template<class T> class Allocator{ public: T *objihold; Allocator(){ objihold = (T)allocate(sizeof(T)); //вызов конструктора и тд... } //перегрузка операторов доступа... } ..... SomePtr = Allocator(SomeClass);
те выехать на тот что класс создается через врапер, алокация которого находиться в cpp и никакие танцы своими переопределениями new\delete не создает
к сожалению не помню точно как использовать malloc и компанию для создания обьекта и его правильной инициализации — слишком давно делал :(
А вообще проблема алокации сложная чтука.
Как-то почти неделю парился с падением сервиса «по памяти» из-за различных значений выравнивания данных в различных использующихся либах
У ms линкера нет приоретитета директорий поиска библиотек?
сдается мне что вам придется пересобрать CRT (каталог %vs_part%\VC\crt\src\)…
После прочтения таких топиков поражаешься количеству костылей, подставленных C++ за всё время его существования.
Попробуйте запостить багу в Microsoft Connect.
Вариант решения:
— перенести реализацию операторов new/delete непосредственно в проект Managed, проект NewDelete соответственно убрать за ненадобностью, в свойствах проекта Native поставить «Static Lib».
Этот вариант точно работает.
Вообще, переопределять глобальный оператор new когда проект состоит из нескольких частей, разнесённых в dll'и — это как-то храбро очень. Не уверен, что такое решение внутренних граблей не содержит.
Ещё можно (если лёгких путей не ищите) — поменять способ перехвата операторов new/delete (через хуки на msvcrt(d).dll, например).
— перенести реализацию операторов new/delete непосредственно в проект Managed, проект NewDelete соответственно убрать за ненадобностью, в свойствах проекта Native поставить «Static Lib».
Этот вариант точно работает.
Вообще, переопределять глобальный оператор new когда проект состоит из нескольких частей, разнесённых в dll'и — это как-то храбро очень. Не уверен, что такое решение внутренних граблей не содержит.
Ещё можно (если лёгких путей не ищите) — поменять способ перехвата операторов new/delete (через хуки на msvcrt(d).dll, например).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проблема глобального переопределения new/delete в C++/CLI