是否可以将std :: basic_string用作char *的包装器?

Dmi*_*gin 7 c++ memory-management stl c++11

我有第三方库,该库返回由strdup(分别为wcsdup函数)在其中创建的char *(和wchar_t *)。

我想避免在代码末尾手动调用free。

是否可以为std :: basic_string编写分配器,以便处理该库返回的C字符串?理想情况下,我根本不希望分配任何新内存,而是使用返回的内存块(字符串应该是常量)。

Gem*_*lor 8

遗憾的是,std :: string会执行自己的内存管理,并且无法重用已分配的字符串。

您可以将它们复制到std :: string并立即删除它们,但这将调用您试图避免的所有行为。

您可以立即使用自定义删除器声明一个unique_ptr。如果超出范围,它将调用删除程序free()。同时,您可以像使用原始指针一样使用它。

std::unique_ptr<char, decltype(free)*> RAII(makeAPICall(), free);
Run Code Online (Sandbox Code Playgroud)

将来您可以为std :: string_view创建一个拥有的包装器,并且在短期内滚动自己的包装可能会有好处,但是除非您有更新了所有方法的stdlib(c ++ 17) string_view我确认这是徒劳的。