我目前正在开发一个项目,我必须为C ++ dll构建一个shell,因此新的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;
}
有没有办法阻止数组中的值在不保留原始线程的情况下被释放? 非常感谢你提前
答案 0 :(得分:3)
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, ...);
在CreateReportPaneThread
完成数组后,请记得编写 deallocate 数组:
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
}
答案 1 :(得分:2)
动态分配数组以防止在CreateReportPane()
退出时数组超出范围:
int* iArray = new int[2];
iArray[0] = id;
iArray[1] = what;
否则线程正在访问不再有效的数组,这是未定义的行为。当不再需要时,线程例程CreateReportPaneThread()
必须delete[]
数组(注意使用delete[]
而不是delete
)。