返回一个“const char *”作为std :: string&从类方法

时间:2018-06-14 07:56:44

标签: c++ string reference

我有一个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 *”

2 个答案:

答案 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)));
}