Я не понимаю, как C # callle может выделить память, где C ++ вызываемый не смог?
Вы ищете неправильную проблему , Проблема не в том, «как C # может выделить память». Любой может выделить память ... И слишком много способов :-) Проблема всегда «как вы освободите память?», Потому что освобождение памяти так же важно, как выделение памяти (не освобождение памяти приведет к памяти утечки, которые сделают ваше занятие памятью программы пройденным шаром, а освобождение его с помощью неправильного распределителя не освободит его как минимум (см. предыдущую точку) и в худшем случае приведет к сбою программы ).
Теперь ОС (например, Windows) дает вам некоторые распределители (например, CoTaskMemAlloc
), которые может использовать любой пользователь, но проблема в том, что обычно в C / C ++ вы используете, Используйте malloc
/ new
. И проблема здесь: эти распределители могут быть «разными» (отдельными) между двумя dll: две библиотеки dll, скомпилированные в C / C ++ (но, например, с разными версиями Visual C ++ или в режиме отладки vs release или один с использованием среды выполнения как dll, а другая, связанная непосредственно с исполняемой средой или скомпилированная с разными компиляторами C), будет иметь различные malloc
(и различные new
в C ++). Имея различные malloc
/ new
, они будут иметь free
/ delete
, так что free
одной dll не может освободить память другой dll.
Теперь ... Используя эту подпись:
void MyCPPDllFunction(char *out, int maxOutSize);
вызывающий должен выделить память ... Таким образом, вызывающий пользователь знает, как освободить память ... Нет утечки памяти: -)
С помощью этой сигнатуры:
char *MyCPPDllFunction();
вызываемому приходится выделять память ... А теперь как может вызывающий ее освободить? Вызов может экспортировать другой метод:
void FreeMemoryAllocatedByMe(void *ptr)
{
free(ptr);
}
, после чего вызывающий абонент вызовет его, и все будет решено, потому что free
будет вызываемым free
.
Теперь ... В общем случае, когда объекты (и строки) C # -маршалов, он использует CoTaskMemAlloc
для выделения памяти, и ожидает, что если он получит память, он должен освободить ее с помощью CoTaskMemFree
, Итак, в примере C ++ -> C # C ++ должен
CoTaskMemFree(output);
Это довольно легко сделать именно то, что вы хотите. Ларавел отлично умеет создавать отношения.
Вам нужно будет настроить модель класса как отношение к вашей пользовательской модели. См. документы о том, как это сделать
. Затем, когда вы извлекаете пользователей из базы данных в контроллере, вы можете напрямую включить отношения:
$users= \App\User::with('class')->get();
Теперь у вас есть соответствующая модель класса в вашей коллекции для каждого из ваших пользователей, вы можете перетащить имя напрямую, как вам угодно в представлении блэйда:
@foreach($users as $user)
{{$user->class->name}}
@endforeach
Я предлагаю сначала протестировать этот простой дамп, как это будет работать. Затем вы можете попробовать присоединить различные модели, например, категории.
НТН