簡體   English   中英

可以將char *移動到std :: string中嗎?

[英]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指針超出范圍后泄漏存儲器?

並不是我太擔心額外的副本,但我想知道是否有可能用現代的移動語義風格來編寫它。

std :: string構造函數 #5:

構造字符串,其內容使用s指向的以null結尾的字符串的副本進行初始化 字符串的長度由第一個空字符決定。 如果s不指向CharT的至少Traits :: length(s)+1元素的數組,則行為是未定義的,包括s是空指針的情況。

您的C字符串被復制( std::move在這里無關緊要),因此您可以在foo free調用。

std::string永遠不會擁有所有權。

tl;博士:不是。

指針沒有任何特殊的移動語義。 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.

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