假设我有一个字符数组,我已在堆上分配,并且我想将其转换为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风格的字符*缓冲区,并且无法将我的代码转换为仅使用内置字符串操作(这是建议的答案)。
有没有一些标准的方法可以做到这一点,还是我应该写自己的字符串类(呃)?谢谢!
答案 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