gpt4 book ai didi

c++ - 将指针数组作为空指针传递给 C++ 中的新线程

转载 作者:行者123 更新时间:2023-11-30 01:24:50 24 4
gpt4 key购买 nike

我目前正在从事一个项目,我必须为 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;
}

有什么方法可以防止在不保留原始线程的情况下释放数组中的值?提前致谢

最佳答案

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 中完成数组的解除分配:

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
}

关于c++ - 将指针数组作为空指针传递给 C++ 中的新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13285718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com