У меня есть код C#, который взаимодействует с кодом C++, выполняющим операции со строками.
У меня есть этот фрагмент кода в статическом вспомогательном классе:
internal static unsafe byte* GetConstNullTerminated(string text, Encoding encoding)
{
int charCount = text.Length;
fixed (char* chars = text)
{
int byteCount = encoding.GetByteCount(chars, charCount);
byte* bytes = stackalloc byte[byteCount + 1];
encoding.GetBytes(chars, charCount, bytes, byteCount);
*(bytes + byteCount) = 0;
return bytes;
}
}
Как видите, он возвращает указатель на байты, созданные с помощью ключевого слова stackalloc
.
Однако из Спецификации C# 18.8:
Все выделенные в стеке блоки памяти, созданные во время выполнения члена функции, автоматически отбрасываются, когда этот член функции возвращается.
Означает ли это, что указатель действительно недействителен, как только метод возвращается?
Текущее использование метода:
byte* bytes = StringHelper.GetConstNullTerminated(value ?? string.Empty, Encoding);
DirectFunction(NativeMethods.SCI_SETTEXT, UIntPtr.Zero, (IntPtr) bytes);
Следует ли изменить код на
...
int byteCount = encoding.GetByteCount(chars, charCount);
byte[] byteArray = new byte[byteCount + 1];
fixed (byte* bytes = byteArray)
{
encoding.GetBytes(chars, charCount, bytes, byteCount);
*(bytes + byteCount) = 0;
}
return byteArray;
И снова использовать fixed
для возвращаемого массива, чтобы передать указатель на метод DirectFunction
?
Я пытаюсь свести к минимуму количество использований fixed
(включая операторы fixed
в других перегрузках GetByteCount()
и GetBytes()
из Encoding
).
tl;dr
Является ли указатель недействительным, как только метод возвращается? Является ли он недействительным на момент передачи
DirectFunction()
?Если да, то как лучше всего использовать наименьшее количество операторов
fixed
для выполнения задачи?