簡體   English   中英

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,並且我保證在線程結束時取消分配字符串嗎?)

PS更改append_task()函數是一個選項。

首先,拋棄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());} );
}

首先,代碼中存在一個危險的錯誤:

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

std::string::length返回std::string::length的大小,以字節為單位, 不包括字符串末尾的空字節 然后使用strcpy復制到此緩沖區, strcpyconst char *讀取,直到它到達緩沖區的空字節,現在它太短而不能包含空字節。 然后你將這個const char *傳遞給一個函數,該函數現在不知道這個數組有多長,並且可能假設它是一個空終止的數組。 這種錯誤在C中很常見,你真的需要避免直接處理C風格的字符串盡可能多的人。

至於如何解決您的問題,我無法改進使用Sneftel提供的lambda的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM