c ++ shared_ptr从char *到void *

时间:2015-01-21 09:39:44

标签: c++ multithreading

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

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,并且我保证在线程结束时取消分配字符串?)

P.S。更改append_task()功能是一种选择。

2 个答案:

答案 0 :(得分:6)

首先,将第二个参数抛弃到append_task,并使其采用不带参数的函数。然后按值传递function,而不是参考。这样,您就可以在lambda中绑定额外的数据,并依靠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());} );
}

答案 1 :(得分:4)

首先,您的代码中存在一个危险的错误:

char *str = new char[name.length()];
strcpy(str, name.c_str());

std::string::length以字节的形式返回字符串的大小,不包括字符串末尾的空字节。然后使用strcpy复制到此缓冲区,该缓冲区从const char *读取,直到它到达缓冲区的空字节,该缓冲区现在太短而无法包含空字节。然后,您将此const char *传递给一个函数,该函数现在不知道该数组有多长,并且可能假设它是一个空终止数组。这种错误在C中非常常见,你真的需要避免直接处理C风格的字符串。

至于如何解决您的问题,我无法使用Sneftel提供的lambda改进解决方案。