@daniil14056

Почему с отладкой нет ошибки, а без отладки есть?

struct tS : IDsposable{
  int[]arr;
  public tS(){
    arr = new int[1000000];
     handle =GCHandle.Alloc(reg,GCHandleType.Pinned); 
      }
}
class Test{  Ts*ts;
  unsafe public Test(ref tS t)
  { 
      /// можно ли как-то без fixed  
      fixed(TestStruct*ptrT = &t){ 
          tS = ptrT; 
      }
  }}
//...............
 Test tt = new Test( ref tStruct); // 
// fun запускает  там бессмысленные вычисления и вызывает  сборки мусора(но и без сборок мусора те же ошибки), которая работает с tS.arr в какой момент tS.arr становится равным нулю? 
 for(int i=0;i<1000;i++)
           fun(  tt)
   return;
 // fun - локальная функция в конце метода. 
//(может в ней все дело, исправил на обычную, и там уже другие ошибки)
   void fun(){.... }

В чем дело. Почему в откладке все работает, без откладки ошибка сразу же.
И не знаю где, в смысле знаю, но когда. Почему поле
в Test.tS.arr == null в какой-то момент почему?
Но самый главный вопрос, почему в откладке я не ловлю ошибку
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
fixed(TestStruct*ptrT = &t){ 
          tS = ptrT; 
      }

Не стоит сохранять указатель на стек в поле класса - класс легко может пережить практически любую такую ссылку.
Тем более что тут ты сохранил указатель на локальную переменную, в которой хранится указатель на структуру.

В твоём случае я вообще не вижу необходимости в хранении указателей на структуру и в unsafe вообще- ты можешь просто копировать её, тк она не очень большая.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
1. fixed закрепляет переменную только в своем блоке это раз. Зачем закреплять ссылку на стек? fixed служит для закрепления объектов, от перемещения сборщиком мусора. Тем более как выше сказали, со стеком работать по ссылкам, себе дороже.

2. Ну скорее всего, в режиме отладки пропускаются какие то оптимизации JIT`а или сборщик работает иначе.

3. зачем выделять память через GCHandle.Alloc? Массив передается в неуправляемый код в стороннюю библиотеку? Это сделано именно для этого.

Как в примере, тут и без всего этого обойтись можно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы