Я столкнулся с довольно странным поведением, которое я даже не знаю, как начать описывать.
Я написал фрагмент управляемого кода C ++, который выполняет вызовы нативных методов.
(очень) упрощенная версия кода выглядела бы так (я знаю, что это выглядит как полноценная нативная функция, просто предположим, что в некоторых местах выполняются управляемые вещи):
int somefunction(ptrHolder x)
{
// the accessptr method returns a native pointer
if (x.accessptr() != nullptr) // I tried this with nullptr, NULL, 0)
{
try
{
x->doSomeNativeVeryImportantStuff(); // or whatever, doesn't matter
}
catch (SomeCustomExceptionClass &)
{
return 0;
}
}
SomeOtherNativeClass::doStaticMagic();
return 1;
}
Я скомпилировал этот код без оптимизации, используя флаг / clr (VS.NET 2005, SP2), и при запуске его в отладчике я получаю оператор if, так как указатель фактически равен нулю, я не вводю if Удивительно, но курсор сразу переходит к оператору return 1, полностью игнорируя метод doStaticMagic () !!!
Глядя на ассемблерный код, я вижу, что он действительно переходит непосредственно к этой строке.
Если я заставлю отладчик войти в блок if, я также перейду к оператору return 1 после нажатия F10.
Есть идеи, почему это происходит?
Спасибо,
Ariel