从char*移动std :: string的构造函数

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)

避免泄漏.

Pra*_*ian 8

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(),deletes超出范围时,字符串将为d .

即使你用第一个选项去,我建议存储的返回值f()unique_ptr将它传递给之前std::string的构造.这样,如果构造抛出,返回的字符串仍将被删除.