[英]c++ shared_ptr from char* to void*
我试图将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,并且我保证在线程结束时取消分配字符串吗?)
PS更改append_task()
函数是一个选项。
首先,抛弃append_task
的第二个参数,并使其成为一个没有参数的函数。 然后按值传递function
,而不是参考。 这样,你可以在lambda中绑定额外的数据,并依靠std::string
和std::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());} );
}
首先,代码中存在一个危险的错误:
char *str = new char[name.length()];
strcpy(str, name.c_str());
std::string::length
返回std::string::length
的大小,以字节为单位, 不包括字符串末尾的空字节 。 然后使用strcpy
复制到此缓冲区, strcpy
从const char *
读取,直到它到达缓冲区的空字节,现在它太短而不能包含空字节。 然后你将这个const char *
传递给一个函数,该函数现在不知道这个数组有多长,并且可能假设它是一个空终止的数组。 这种错误在C中很常见,你真的需要避免直接处理C风格的字符串尽可能多的人。
至于如何解决您的问题,我无法改进使用Sneftel提供的lambda的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.