簡體   English   中英

是否可以使用std :: basic_string作為char *的包裝?

[英]Is it possible to use std::basic_string as a wrapper around char*?

我有第三方庫,它返回由strdup(和wcsdup函數)分別創建的char *(和wchar_t *)。

我想避免在我的代碼結束時手動調用。

是否可以為std :: basic_string編寫一個分配器,以便它處理這個庫返回的這個c字符串? 理想情況下,我根本不想分配任何新內存並使用返回的內存塊(字符串應該是常量)。

遺憾的是,std :: string執行自己的內存管理,無法重用malloced字符串。

您可以將它們復制到std :: string並立即刪除它們,但這會調用您要避免的所有行為。

您可以做的是立即使用自定義刪除器聲明unique_ptr。 當它超出范圍時,它將調用刪除器,它將是free() 同時,您可以像使用原始指針一樣使用它。

std::unique_ptr<char, decltype(free)*> RAII(makeAPICall(), free);

將來你可以為std :: string_view創建一個擁有的包裝器,也許在短期內滾動你自己的優勢,但除非你有一個更新的stdlib(c ++ 17)復制了所有的方法string_view我認為這是徒勞的練習。

你不能使用std::basic_string std::basic_string管理它自己的內存,因此它會分配新的存儲空間並將數據復制到字符串中。 您仍然必須從返回的指針手動釋放存儲。

如果你可以使用C ++ 17,你可以使用std::basic_string_view因為它只會保存指針的副本,但你會遇到同樣的問題,你需要手動為指針調用釋放函數完成它。

你可以做的是使用std::unique_ptrstd::shared_ptr與自定義刪除器來存儲函數返回的指針,這樣它就會自動為你重新分配memmory。 然后,如果你可以使用C ++ 17,你可以得到一個std::basic_string_view到那個指針,這樣你就可以擁有所有的字符串函數,而不必復制。 否則可以使用<cstring>的c-string函數來處理它或編寫自己的std::basic_string_view版本(或者找一個像這樣的一個 C ++ 11庫)

我想避免在我的代碼結束時手動調用。

如果庫不這樣做,那么你就無法避免free呼叫(無視故意泄漏內存)。

如果庫本身不使用字符串,那么如果你想使用std::stringstd::wstring ,你可以使用接受CharT*的構造函數,並在創建字符串后立即使用free釋放原始文件。 。

如果您希望避免額外的分配和復制,那么std::string不是一個選項。 當指針超出范圍時,您可以使用智能指針解除分配。

string_view

template<class T, class Deleter=std::default_delete<T>>
struct string_view_buff : std::string_view<T> {
  std::unique_ptr<T[]> buff;
  explicit string_view_buff( T* in, Deleter d = {} ):
    buff( in, std::move(d) ),
    std::string_view<T>(in) {}
};

類似的東西可以取得緩沖區的所有權,同時暴露類似字符串的功能而無需額外的堆分配。 (代碼未經測試)

在此之前,不, std::string分配和管理自己的內存。 你不能給它一個緩沖區和刪除功能。

暫無
暫無

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

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