Передача массива указателей как недействительных указателей на новый поток в переполнении стека

В настоящее время я работаю над проектом, в котором мне нужно создать оболочку для 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;
}

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

1

Решение

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
}
3

Другие решения

Динамически размещать массив, чтобы предотвратить выход массива из области видимости, когда CreateReportPane() выходы:

int* iArray = new int[2];
iArray[0] = id;
iArray[1] = what;

в противном случае поток обращается к массиву, который больше не является допустимым, что является неопределенным поведением. Рутина потока CreateReportPaneThread() должен тогда delete[] массив, когда он больше не требуется (обратите внимание на использование delete[] и не delete).

2

По вопросам рекламы [email protected]