我有一个C-Libraray函数返回一个C-String
const char* myFuncC(struct myS *);
现在我写了一个类映射器:
class myC {
private:
struct myS * hdl
...
public:
const char* myFunc() {
return myFuncC(hdl);
}
// want to have...
const std::string& myFuncS() {
return ??? myFuncC(hdl);
}
}
现在我想返回一个: const std::string&
,我不想要复制 C-String指针数据
我是怎么做到的?
更新
是否有一个C ++类,它的行为类似于 const C ++ - String 类,并使用 const C-String指针作为字符串源?
我会称这个类为 C ++ - String-External ... 外部意味着...使用外部源作为存储...在我的情况下a “const char *”
答案 0 :(得分:3)
std::string
拥有其记忆,我们无法改变这一点。此外,通过返回引用,您将创建对局部变量(或内存泄漏)的悬空引用。
然而,在没有复制的情况下将连续字符范围封装在类似字符串的接口中的想法是一个常见的问题,C ++ 17添加了一个新类型std::string_view
来实现这一点。有了它,您的代码可以写成:
std::string_view myFuncS() {
return {myFuncC(hdl)};
}
string_view
不是字符串,但它有一个非常相似的API,我们的想法是使用它而不是string const&
的许多当前用途。它非常适合这里的工作。
请注意,我们正在返回副本,以避免悬空引用。但是,这不会复制底层内存,而且价格便宜 - 几乎与返回引用一样便宜。
答案 1 :(得分:1)
只需返回一个新字符串:
std::string myFuncS() {
return std::string(myFuncC(hdl));
}
如果你真的需要refence或指针,那么在堆上分配字符串并返回指向它的指针:
std::unique_ptr<std::string> myFuncS() {
return std::unique_ptr<std::string>(new std::string(myFuncC(hdl)));
}