【问题标题】:Passing pointer array as void pointer to new thread in c++将指针数组作为void指针传递给c ++中的新线程
【发布时间】:2012-11-08 09:03:48
【问题描述】:

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

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

【问题讨论】:

  • 别忘了 CloseHandle(hThread),否则你会泄漏句柄和内存。
  • 我可能会为此创建一个结构,但是如果您想使用数组,为什么不在线程中使用数组表示法呢?例如。 int* iArray = (int*) lparam; int id = iArray[0]; int what = iArray[1];

标签: c++ arrays multithreading pointers void


【解决方案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, ...);

记住在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
}

【讨论】:

  • 啊,是的,当然,非常感谢你们,它解决了我的问题!
  • @wyndesmit:如果它解决了您的问题,您应该通过单击 tick 标记来接受它作为“答案”。
  • 啊,是的,我还是这个界面的新手 :)
【解决方案2】:

动态分配数组,防止CreateReportPane()退出时数组超出范围:

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

否则线程正在访问一个不再有效的数组,这是未定义的行为。当不再需要数组时,线程例程 CreateReportPaneThread() 必须随后 delete[] 数组(注意使用 delete[] 而不是 delete)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2013-06-25
    • 2012-10-06
    • 1970-01-01
    • 2013-01-27
    • 2012-11-08
    相关资源
    最近更新 更多