В настоящее время я работаю над проектом, в котором мне нужно создать оболочку для C ++ dll, чтобы новый C # GUI мог использовать его функции.
Однако у меня возникла следующая проблема: в части C ++ я должен создать новый поток по определенным причинам, и я хочу передать массив int в новый поток.
Обратите внимание, что значения, присвоенные массиву в функции, в которой это происходит, получены из части кода C #.
__declspec( dllexport ) void CreateReportPane(int &id, int &what)
{
DWORD threadId;
int iArray[2] = { id, what};
HANDLE hThread = CreateThread( NULL, 0, CreateReportPaneThread, iArray, 0, &threadId);
if (hThread == NULL)
{
ExitProcess(3);
}
}
Проблема возникает в новом потоке, я могу надежно извлечь первое значение из массива, но второе значение, кажется, освобождено, вот код на другой стороне.
DWORD WINAPI CreateReportPaneThread(LPVOID lparam)
{
int id, what;
id = *(( int * )lparam);
what = *(((int *)lparam)+1) ;
CreateReportPaneOriginal(id, what);
return 0;
}
Есть ли способ предотвратить освобождение значений в массиве, не удерживая оригинальный поток в плену?
Большое спасибо заранее
int iArray[2] = { id, what};
HANDLE hThread = CreateThread(...,CreateReportPaneThread, iArray, ...);
Проблема в том, что iArray
это локальный массив, который означает, что это разрушается, когда функция CreateReportPane()
возвращается. И что CreateReportPaneThread()
относится к не существует. Вы получаете первое значение случайно. Нет такой гарантии, что вы получите хотя бы первое значение.
Используйте динамический массив:
int * iArray = new int[2];
iArray[0] = id;
iArray[1] = what;
HANDLE hThread = CreateThread(...,CreateReportPaneThread, iArray, ...);
Не забудьте написать DEALLOCATE массив, как только вы закончите с этим в CreateReportPaneThread
:
DWORD WINAPI CreateReportPaneThread(PVOID *data)
{
int *array = static_cast<int*>(data);
int id = array[0], what = array[1];
delete []array; //MUST DO IT to avoid memory leak!
//rest of your code
}
Динамически размещать массив, чтобы предотвратить выход массива из области видимости, когда CreateReportPane()
выходы:
int* iArray = new int[2];
iArray[0] = id;
iArray[1] = what;
в противном случае поток обращается к массиву, который больше не является допустимым, что является неопределенным поведением. Рутина потока CreateReportPaneThread()
должен тогда delete[]
массив, когда он больше не требуется (обратите внимание на использование delete[]
и не delete
).