[英]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.