У меня вопрос, почему он работает, когда строка не закомментирована, но возвращает закомментированный мусор, когда закомментирован.
Закомментированная строка - это то, что маскирует ошибкавызвано CreateArray.Комментируя это, выявляет ошибку.Но ошибка существует независимо от этого.
Как ясно указывается в спецификации:
Все выделенные в стеке блоки памяти, созданные во время выполнения члена функции, автоматически отбрасываются при возврате этого члена функции.
Функция CreateArray выделяет блок, вы сохраняете указатель на блок, блок отбрасывается, и теперь у вас есть указатель на блок мусора.От вас требуется до никогда не сохранять указатель на блок stackalloc , чтобы к хранилищу можно было получить доступ после того, как блок станет недействительным.Куча выделяет блок, если вам нужно сохранить ссылку на него, и не забудьте освободить его, когда закончите.
Помните, что в небезопасном коде вы должны полностью понимать все о модели управляемой памяти. Все .Если вы не понимаете всего, что связано с управляемой памятью, не пишите небезопасный код.
Тем не менее, давайте обратимся к тому, что кажется вам большим заблуждением, а именно, «когда вам нужно исправить память, чтобыуказатель?"Ответ прост. Вы должны исправить память, если и только если это подвижная память. Исправление превращает подвижную память в неподвижную память; это то, что исправление для .
Вы можете взять адрес только того, что неподвижно;если вы берете адрес чего-то подвижного и оно перемещается, то, очевидно, адрес неверный.Вы должны убедиться, что память не будет перемещаться до того, как вы получите ее адрес, и вы должны убедиться, что вы не используете адрес после того, как он снова станет подвижным.