Зачем мне новые нативные объекты в смешанном режиме? - PullRequest
1 голос
/ 22 октября 2010

У меня есть библиотека смешанного режима C ++ / CLI (VS 2008), которая затем создает собственные объекты и вызывает методы.Родной dll написан на чистом с ++.Теперь в моих методах-оболочках C ++ / CLI, если я объявляю объект нативных классов в c ++ как

ClassA obj;
Obj.Method(); 

и использую его, он работает, но я получаю System.AccessViolationException: Attempt to read or write protected memory, когда программа существует.

Но если я сделаю это так

ClassA *obj = new ClassA();
Obj->Method();

, то все будет работать нормально.Поэтому мой вопрос: почему я не могу объявить объект только в стеке способом C ++?Destructor в нативном коде объявлен виртуальным.Это причина?

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Нет, это никак не связано со стеком и кучей.Стек в управляемой программе ничем не отличается от стека в нативной программе.Использование нативного кода в управляемой программе не уменьшает вероятность того, что он разрушит кучу, растоптает кадр стека, перезапишет конец буфера, вызовет неопределенное поведение, обычные вещи, которые приводят к сбою нативного кода при доступенарушение.

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

0 голосов
/ 22 октября 2010

Полагаю, ваш деструктор содержит ошибку. При выходе из программы ваш деструктор отключается в первом случае, но не во втором. Вы можете проверить это, добавив

delete obj;

где-нибудь в вашем коде второго случая, и пошагово отладчик, чтобы увидеть, если вы получите исключение. Тогда решите проблему в вашем деструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...