Rug*_*rra 7 c++ string move-semantics c++11
我有一个函数f返回一个char*.功能文档说:
The user must delete returned string
Run Code Online (Sandbox Code Playgroud)
我想从中构建一个std::string.琐碎的事情是:
char* cstring = f();
std::string s(cstring);
delete cstring;
Run Code Online (Sandbox Code Playgroud)
是否可以使用C++功能更好地做到这一点?我想写点类似的东西
std::string(cstring)
Run Code Online (Sandbox Code Playgroud)
避免泄漏.
std::string将复制null终止的字符串参数并管理该副本.没有办法让它获得你传递给它的字符串的所有权.所以你所做的是正确的,我建议的唯一改进是检查nullptr,假设这是一个有效的返回值f().这是必要的,因为std::string构造函数char const *需要参数指向有效数组,而不是nullptr.
char* cstring = f();
std::string s(cstring ? cstring : "");
delete[] cstring; // You most likely want delete[] and not delete
Run Code Online (Sandbox Code Playgroud)
现在,如果您不需要所有std::string的界面,或者如果避免复制很重要,那么您可以使用a unique_ptr来管理字符串.
std::unique_ptr<char[]> s{f()}; // will call delete[] automatically
Run Code Online (Sandbox Code Playgroud)
您可以访问托管char *via s.get(),delete当s超出范围时,字符串将为d .
即使你用第一个选项去,我建议存储的返回值f()在unique_ptr将它传递给之前std::string的构造.这样,如果构造抛出,返回的字符串仍将被删除.