Zon-cpp Ответов: 2

Новая память в DLL, которая использует ее в других проектах


Привет,

В проекте Dll (VC++) я определил функцию , которая получает wchar_t* и возвращает wchar_t* в параметре.
Мой вопрос заключается в следующем: правильно ли создать указатель(new wchar_t*) с указанным размером, а затем вернуть его в качестве параметра refernce ?
как "срет" в моем коде:
extern "C"
{

	__declspec(dllexport) int  Function(wchar_t*  s, wchar_t*  sret,  int len)
	{
		int sLen = wcslen(s);
		sret = new wchar_t(sLen+4);
		wcscpy_s(sret, sLen, s);
		wcscat_s(sret, 4, L"_456");
		len = wcslen(sret);
		return 1;
	}
}


Я хочу использовать эту библиотеку dll в других проектах windows . У них же память не возникает с проблемами?

Что я уже пробовал:

создайте wchar_t* в функцию dll, а затем верните ее

2 Ответов

Рейтинг:
0

Richard MacCutchan

Это не сработает, потому что sret это локальный указатель, поэтому вызывающее приложение все равно будет иметь его указывающим куда-то еще. Вы нуждаетесь в этом address из указателя, что-то вроде:

__declspec(dllexport) int  Function(wchar_t*  s, wchar_t**  sret,  int len)
{
    int sLen = wcslen(s);
    *sret = new wchar_t(sLen+4); // should be sLen + 5
    wcscpy_s(*sret, sLen, s);
    wcscat_s(*sret, 4, L"_456");
    len = wcslen(*sret); // what is this line for?

    return 1; // what is this line for?
}

Однако гораздо лучшим способом было бы просто вернуть указатель, что-то вроде:
__declspec(dllexport) wchar_t* Function(wchar_t*  s)
{
    int sLen = wcslen(s);
    wchar_t* sret = new wchar_t[sLen + 5];
    wcscpy_s(sret, sLen, s);
    wcscat_s(sret, 4, L"_456");

    return sret;
}

Есть ли конкретная причина, по которой вы думаете, что это должно быть в DLL?


CPallini

5.

Рейтинг:
0

CPallini

В дополнение к Ричард решение, взгляните на c++ - это плохая практика выделять память в DLL и давать указатель на нее клиентскому приложению? - переполнение стека[^].
К сожалению, несоответствия между распределителем и деаллокатором действительно случаются и не являются приятными.


Richard MacCutchan

Ха-ха. Это мне сказало :(