Проверьте значение .NET Handle ^ - PullRequest
       15

Проверьте значение .NET Handle ^

1 голос
/ 03 октября 2011

Вот моя ситуация:

У меня есть объекты-оболочки .NET на уровне C ++ / CLI, которые содержат указатели на неуправляемые объекты C ++. Я реализовал финализатор так, чтобы он удалял неуправляемую память, указанную объектом-оберткой в ​​сборщике мусора, и устанавливал указатель на ноль.

Вот проблема :

Я наблюдаю финализатор объекта-оболочки .NET, который вызывается дважды и пытается дважды удалить одну и ту же память, указывая, что я каким-то образом создал 2 объекта-оболочки .NET, которые выходят за пределы области видимости, уборка мусора, в то время как я все еще ожидаю, что объект оболочки находится в области видимости (эти объекты оболочки передаются в приложение VB.NET).

Вот мой вопрос:

Могу ли я в любом случае проверить значение дескриптора, чтобы я мог подтвердить, где создаются объекты-оболочки (копируются или как-то еще)? В настоящее время я смотрю на значения дескриптора (EG - 0x0014fe80), но вижу 3 разных значения, когда объект создается, добавляется в коллекцию и удаляется. Поэтому я не уверен, что GC просто перемещает вещи вокруг, и это один и тот же объект, или я на самом деле вижу 3 разных объекта, которые ссылаются на одну и ту же неуправляемую память. Я хотел бы разрешить дубликаты копий объектов, если это возможно, но я понимаю, что, вероятно, захочу реализовать какой-нибудь интеллектуальный указатель, чтобы этого не произошло.

Спасибо, Ian

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Взгляните на этот вопрос
Здесь - это реализация scoped_ptr, которая не может быть скопирована и имеет механизм автоматического выпуска для неуправляемых объектов, автор @Ben Voigt

0 голосов
/ 04 октября 2011

Да, в итоге я изменил класс auto_ptr, чтобы он стал общим указателем, чтобы гарантировать, что неуправляемая память удаляется только один раз через финализатор интеллектуальных указателей.Я предполагаю, что сделал что-то похожее на все другие реализации;Я создал статический словарь в классе шаблона auto_ptr, используя собственное значение указателя в качестве ключа, который проверяется каждый раз, когда вызывается финализатор, чтобы обновить счетчик каждого элемента или удалить память.

...