c++ что означают данные строки?

147
20 января 2020, 10:00

Имеется фрагмент когда

pin_ptr<const wchar_t> wch = PtrToStringChars(source);
auto ptr = reinterpret_cast<void const *>(wch);
const int Length = source->Length;
wchar_t * const data = new wchar_t[Length];
memcpy(data, ptr, Length * sizeof(wchar_t));

source- поступает в качестве параметра функции. Объясните пожалуйста, что делают данные функции, это просто копирование строки с одной переменной в другую? Перевожу данный код на c#

Answer 1

Данный фрагмент преобразует управляемую строку .NET в массив широких символов С++ и размещает его в динамической памяти. При этом он содержит потенциальную проблему: память под завершающий нуль-символ не выделяется, поэтому такой массив не будет корректно обработан многими функциями стандартной библиотеки для работы со строками (это может и не быть проблемой в конкретном коде, но помнить об этом полезно).

В C# обычно нет необходимости в таком преобразовании в явном виде, так как String имеет метод ToCharArray для преобразования в массив символов, а при вызове нативных функций маршаллер P/Invoke умеет автоматически преобразовывать объекты string (или StringBuilder) в неуправляемые строки. Близким аналогом является метод Marshal.StringToHGlobalUni, но он выделяет память под нуль-символ. Совсем буквальный перевод будет выглядеть как-то так:

IntPtr data = Marshal.AllocHGlobal(source.Length);
Marshal.Copy(source.ToCharArray(), 0, data, source.Length);
READ ALSO
Fluent Api и Web Api

Fluent Api и Web Api

Я новичок в Entity Framework и Fluent ApiЯ создал несколько моделей, создал базу данных

205
C# Получение данных из mssql по полю datatable

C# Получение данных из mssql по полю datatable

Всем привет! Ситуация следующая

146
Как получить список шаблонов процесса в TFS?

Как получить список шаблонов процесса в TFS?

Мне нужно получить список шаблонов процесса в TFS, чтобы в дальнейшем создавать свои шаблоны процессовКак получить этот интерфейс?

178