[英]Can a char* be moved into an std::string?
說我有這樣的事情
extern "C" void make_foo (char** tgt) {
*tgt = (char*) malloc(4*sizeof(char));
strncpy(*tgt, "foo", 4);
}
int main() {
char* foo;
make_foo(&foo);
std::string foos{{foo}};
free(foo);
...
return 0;
}
現在,我想避免使用然后刪除foo
緩沖區。 也就是說,我想將foos
的初始化改為類似的東西
std::string foos{{std::move(foo)}};
並且沒有明確的free
使用。
事實證明這實際上是編譯並且似乎有效,但我對它有一種相當可疑的感覺:它是否實際上移動了C定義的字符串並正確釋放存儲? 或者它只是忽略std::move
並在foo
指針超出范圍后泄漏存儲器?
並不是我太擔心額外的副本,但我想知道是否有可能用現代的移動語義風格來編寫它。
構造字符串,其內容使用s指向的以null結尾的字符串的副本進行初始化。 字符串的長度由第一個空字符決定。 如果s不指向CharT的至少Traits :: length(s)+1元素的數組,則行為是未定義的,包括s是空指針的情況。
您的C字符串被復制( std::move
在這里無關緊要),因此您可以在foo
free
調用。
std::string
永遠不會擁有所有權。
指針沒有任何特殊的移動語義。 x = std::move(my_char_ptr)
與x = my_char_ptr
相同。 在這方面它們與std::vector
的不相似,其中移動帶走了分配的空間。
但是,在您的情況下,如果您想保留現有的堆緩沖區並將它們視為字符串 - 它不能使用std::string
,因為它們不能構造為現有緩沖區的包裝(並且小串優化等)。 相反,可以考慮實現一個自定義容器,例如使用一些字符串數據緩沖區( std::vector<char>
)和一個std::vector<std::string_view>
,其元素指向該緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.