[英]use of deleted function 'std::pair<const std::pair<std::basic_string<char>, 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_ptr
或std::shared_ptr
與自定義刪除器來存儲函數返回的指針,這樣它就會自動為你重新分配memmory。 然后,如果你可以使用C ++ 17,你可以得到一個std::basic_string_view
到那個指針,這樣你就可以擁有所有的字符串函數,而不必復制。 否則可以使用<cstring>
的c-string函數來處理它或編寫自己的std::basic_string_view
版本(或者找一個像這樣的一個 C ++ 11庫)
我想避免在我的代碼結束時手動調用。
如果庫不這樣做,那么你就無法避免free
呼叫(無視故意泄漏內存)。
如果庫本身不使用字符串,那么如果你想使用std::string
和std::wstring
,你可以使用接受CharT*
的構造函數,並在創建字符串后立即使用free
釋放原始文件。 。
如果您希望避免額外的分配和復制,那么std::string
不是一個選項。 當指針超出范圍時,您可以使用智能指針解除分配。
在c ++ 17中有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.