Возврат строки C в методе DLL - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь создать интерфейс DLL в стиле C, который принимает входной символ * и назначает выходной символ * после выполнения некоторой операции перевода.Возвращаемое значение функции - код ошибки, поэтому он не будет использоваться для возврата символа *.

. Я вызываю функцию следующим образом:

char* output;
myfunc((char *) input.c_str(), &output);

И функцияопределяется как:

DLL_EXPORT int myfunc(char* input, char** output)
{
    string translation = translate(input);
    *output = (char *) malloc((translation.length()+1)*sizeof(char));
    strcpy(*output,(char *) translation.c_str());
}

Это правильный способ реализации этого?Я создаю утечку памяти?

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Это правильно, но вам также необходимо предоставить другую функцию DLL, которая освободит память.Вы не можете предполагать, что исполняемый файл, который загрузил вашу DLL, использует ту же версию библиотеки времени выполнения C, поэтому, если он попытается вызвать free в возвращенной памяти, вы можете повредить вашу кучу из-за различий в malloc / free реализации в разных средах выполнения.

Ваш API должен выглядеть примерно так:

DLL_EXPORT int myfunc(char* input, char** output)
{
    ...
    *output = malloc(...);
    ...
}

DLL_EXPORT void myfunc_free(char *output)
{
    free(output);
}

См. Также распределение и освобождение памяти через границы модуля .

0 голосов
/ 28 марта 2012

Никогда не думайте, что вы будете использовать одно и то же пространство кучи при вызове app и dll. В этом случае вы должны использовать объект общей памяти Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...