c++ shared_ptr 从 char* 到 void*

标签 c++ multithreading

我正在尝试将 char * 字符串传递给将在线程内执行的函数。该函数具有以下原型(prototype):

void f(void *ptr);

线程分配由类似于以下的函数进行:

void append_task(std::function<void(void *)> &f, void *data);

我想分配一个将在线程内部使用的字符串。现在我有这个:

string name = "random string";
char *str = new char[name.length()];
strcpy(str, name.c_str());
append_task(f, static_cast<void *>(str));

我想放弃手动分配和解除分配内存的义务。我如何使用 std::shared_ptr 执行此操作(即转换为 void,我是否保证在线程结束时释放字符串?)

附言更改 append_task() 函数是一种选择。

最佳答案

首先,放弃 append_task 的第二个参数,让它接受一个没有参数的函数。然后按值而不是引用传递 function。这样,您只需在 lambda 中绑定(bind)额外数据,并依靠 std::stringstd::function 进行内存管理。

像这样:

void f(void *ptr);
void append_task(std::function<void()> f);

int main()
{
    std::string name = "random string";
    append_task( [=]{f((void*)name.c_str());} );
}

关于c++ shared_ptr 从 char* 到 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28063845/

相关文章:

c++ - 如何防止 .h 文件中的多个函数定义

c++ - 分配子对象

c++ - Select() 不在线程中工作

c++ - 如何向线程传递消息

Mac OS 上的 Java 随机变慢

c# - 为什么具有 STAThreadAttribute 的线程不支持 WaitAll 方法?

c++ - 当已经假设 __STDC_IEC_559__ 时,将 float 序列化为字节

c++ - 扫雷程序,意外输出

c++ - 为什么在 C++ 中字节数组中的字节是颠倒的

java - 使用 SwingWorker java 在线程池中等待任务