Как стать автором
Обновить

Комментарии 20

НЛО прилетело и опубликовало эту надпись здесь
Для поиска утечек можно использовать внешние программы: DevPartner Studio, Intel Parallel Inspector. К сожалению ни одна из них не смогла корректно посчитать утечки в C#,C++/CLI, C++ среде.
Можно использовать _CrtSetDbgFlag(), но не удобно с ним работать + проблемы со статическими глобальными переменными.
Visual Leak Detector — не пробывал, надо попробывать.
Еще мы используем nedmalloc, и для этого нам нужны свои глобальные new/delete.
Вы не пробовали включать переопределение ваших операторов new/delete то объявления класса Foo?
Да. Так и есть. Но не помогает.
по-моему, самое место топику — на rsdn.ru, там вам всё в 5 минут растолкуют, здесь-то это зачем?..
ну и поиск рулит, как всегда
В начале разбирательства с проблемой я написал на rsdn.ru Там дали совет про #pragma managed(push,off), про который я написал. Поиск не помогает. :(
запакуйте new && delete операции в C++
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 в конструкцию вида
 template<class T>
 class Allocator{
 public:
   T *objihold;
   Allocator(){
    objihold = (T)allocate(sizeof(T));
   //вызов конструктора и тд...
   }
 //перегрузка операторов доступа...
 }

.....
SomePtr = Allocator(SomeClass);
 


те выехать на тот что класс создается через врапер, алокация которого находиться в cpp и никакие танцы своими переопределениями new\delete не создает

к сожалению не помню точно как использовать malloc и компанию для создания обьекта и его правильной инициализации — слишком давно делал :(

А вообще проблема алокации сложная чтука.
Как-то почти неделю парился с падением сервиса «по памяти» из-за различных значений выравнивания данных в различных использующихся либах
У ms линкера нет приоретитета директорий поиска библиотек?
Смотрел в эту сторону, потенциально должно помочь, но не удалось найти приемлемого решения.
А если msvcrt поставить в Ignore Libs?
НЛО прилетело и опубликовало эту надпись здесь
сдается мне что вам придется пересобрать CRT (каталог %vs_part%\VC\crt\src\)…
После прочтения таких топиков поражаешься количеству костылей, подставленных C++ за всё время его существования.
Проблема не в языке, а в компиляторе.
НЛО прилетело и опубликовало эту надпись здесь
Вариант решения:
— перенести реализацию операторов new/delete непосредственно в проект Managed, проект NewDelete соответственно убрать за ненадобностью, в свойствах проекта Native поставить «Static Lib».

Этот вариант точно работает.

Вообще, переопределять глобальный оператор new когда проект состоит из нескольких частей, разнесённых в dll'и — это как-то храбро очень. Не уверен, что такое решение внутренних граблей не содержит.

Ещё можно (если лёгких путей не ищите) — поменять способ перехвата операторов new/delete (через хуки на msvcrt(d).dll, например).
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории