我在FLTK(用C ++)的新线程(即不是主GUI线程)中执行一项长任务,在某些函数中实现。
我用回调函数实现了这一点,而回调函数又创建了一个线程,以便我有一些形式
void callback(Fl_Widget* widget,void* passed_data){
data_type* data = new data_type;
data->value = x; //populate data structure to send to function
fl_create_thread(thread1,function,data);
}
其中fl_create_thread(至少对我而言)只是使用pthread_create意味着数据变量作为void指针传递,因此' function'也采用了无效指针。
我意识到这实际上会造成内存泄漏,因为我不会删除数据': 我不能在使用fl_create_thread的行之后删除它,因为线程不必(或曾经)完成运行。我已经尝试删除功能结束时的指针'但这引发了两个问题
1)删除空指针是未定义的,所以我收到了警告。
2)这几乎使得使用函数失败了:是否有更好的通用编码实践?
有谁能告诉我应该如何处理这个问题?感谢。
答案 0 :(得分:0)
1)删除void指针是未定义的,因此我收到警告 为此。
你可能在你的函数的最开始就是一个正确类型的转换(或者你应该为了有意义地使用参数)。删除该指针而不是void *
参数,您将不会收到警告。
2)这几乎打败了使用函数的意义:是否存在 更好的通用编码实践?
我不确定自己的观点。这个线程接口(pthread)非常像c,所以它必须求助于void指针才能传递任意数据。您可以查看C++ thread interface以获得更多C ++方式来定义要执行的内容以及使用哪些参数
对于内存,您应该始终清除已分配内存的所有权。这种方法将所有权转移到刚刚创建的线程