【问题标题】:How to create a std::string directly from a char* array without copying?如何直接从 char* 数组创建 std::string 而无需复制?
【发布时间】:2011-10-05 17:47:36
【问题描述】:

假设我有一个字符数组,我在堆上分配了它,我想将它转换成一个 std::string。目前我正在做以下事情:

char *array = new char[size];
WriteIntoArray(array, size);
std::string mystring(array);
delete[] array;
return mystring; // or whatever

根据我在互联网上阅读的内容 (http://www.cplusplus.com/reference/string/string/string/),字符串构造函数执行了我传递给它的缓冲区的副本,让我释放缓冲区(稍后,字符串释放其内部缓冲区)。我想做的是分配我的缓冲区,将它的控制权转移给字符串,然后让它在我的缓冲区被破坏时释放它。

initializing std::string from char* without copy 的问题看起来很有希望,但是我的代码依赖于 API 调用(上例中的“WriteIntoArray”),这些调用必须写入一个字符数组,所以我必须创建一个 C 风格的 char* 缓冲区,并且无法将我的代码转换为仅使用内置字符串操作(这是建议的答案)。

是否有一些标准的方法来做到这一点,或者我应该只写自己的字符串类(呃)?谢谢!

【问题讨论】:

    标签: c++ string stl buffer


    【解决方案1】:

    你不能 std::string 拥有指针,从而将数据复制到它分配的空间中。

    你可以做的是:

    std::string  mystring(size, ' ');
    WriteIntoArray(&mystring[0], size);
    return mystring; // or whatever
    

    【讨论】:

      【解决方案2】:

      如果您使用的是符合标准的 C++0x 实现,或者是保证 std::string 连续存储的众多 C++ 库之一,那么您可以获得一个 char*,它直接指向您的 @ 使用的存储空间987654324@.

      例如:

      std::string mystring;
      mystring.resize(size);
      WriteIntoArray(&mystring[0], size);
      return mystring;
      

      但是,您可能需要仔细考虑空终止符。

      【讨论】:

      • 没有。 reserve() 保留空间,但它不属于字符串(还)。访问 a[0] 或 a[1] 仍然是 UB。如果您结帐 size() 它仍然为零。你真正想要的是 resize()
      • 不能使用reserve(),必须使用resize()。然后在调用后找出合适的 resize() 。
      • reserve 必须是 resize。 “仔细考虑空终止符”的真正含义是什么?是否对&mystring[0] 指向的数组是否必须为空终止做出任何保证? std::string 是否负责确保存在这样的终结者?如果WriteIntoArray 写了一个空终止符,它应该被删除吗? (我问是因为我不知道std::string 保证和要求什么。)
      • 大概WriteIntoArray 放置了一个空终止符,在调用之后需要将其移除;您可能想在返回之前添加mystring.resize(size-1);。如果它没有添加空值,那么您应该使用vector<char> 而不是string
      • @SørenLøvborg 是的,在 C++11 中是允许的。围绕这一点有很多晦涩难懂的措辞,这几乎可以归结为修改空终止符是非法的,通过 data() 或 c_str() 指针修改任何内容都是非法的,但通过 &str[0] 是有效的。 stackoverflow.com/a/14291203/5696
      【解决方案3】:

      您可以实现自己的 std::allocator,而不是为您的字符串分配新内存,而是使用您已经实例化的区域作为源。

      然后您应该使用分配器实例化您的 std::string。

      http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement

      【讨论】:

      • 好主意,完全忘记了分配器。
      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 2022-01-05
      • 2010-09-26
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多