如何直接从char *数组创建一个std :: string而不复制?

时间:2011-07-14 22:04:20

标签: c++ string stl buffer

假设我有一个字符数组,我已在堆上分配,并且我想将其转换为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风格的字符*缓冲区,并且无法将我的代码转换为仅使用内置字符串操作(这是建议的答案)。

有没有一些标准的方法可以做到这一点,还是我应该写自己的字符串类(呃)?谢谢!

3 个答案:

答案 0 :(得分:16)

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

例如:

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

然而,您可能必须仔细考虑一下null终止符。

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:5)

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

你能做的是:

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