c++ shared_ptr 从 char* 到 void*
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,我是否保证在线程结束时释放字符串?)
P.S。更改 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
returns 字符串的大小(以字节为单位)不包括字符串末尾的空字节。然后你用 strcpy
复制到这个缓冲区,它从 const char *
读取直到它在你的缓冲区中遇到一个空字节,这个缓冲区现在太短而不能包含空字节。然后,您将此 const char *
传递给一个函数,该函数现在不知道该数组有多长,并且可能假设它是一个空终止数组。这种错误在 C 语言中很常见,您真的需要尽可能避免直接处理 C 风格的字符串。
至于如何解决你的问题,我无法改进使用 Sneftel 提供的 lambda 的解决方案。
我正在尝试将 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()
函数是一个选项。
首先,放弃 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
returns 字符串的大小(以字节为单位)不包括字符串末尾的空字节。然后你用 strcpy
复制到这个缓冲区,它从 const char *
读取直到它在你的缓冲区中遇到一个空字节,这个缓冲区现在太短而不能包含空字节。然后,您将此 const char *
传递给一个函数,该函数现在不知道该数组有多长,并且可能假设它是一个空终止数组。这种错误在 C 语言中很常见,您真的需要尽可能避免直接处理 C 风格的字符串。
至于如何解决你的问题,我无法改进使用 Sneftel 提供的 lambda 的解决方案。