猿问

c ++中的char * vs std :: string

我std::string什么时候应该使用,什么时候应该char*用来管理charC ++中的s 数组?


似乎你应该使用char*性能(速度)是至关重要的,并且由于内存管理,你愿意接受一些有风险的业务。


是否还有其他需要考虑的方案?


跃然一笑
浏览 576回答 3
3回答

扬帆大鱼

你可以通过引用传递std :: strings如果它们很大以避免复制,或者指向实例的指针,所以我没有看到使用char指针的任何真正优势。我使用std :: string / wstring来获取或多或少的实际文本。char *虽然它对其他类型的数据很有用,但你可以确定它会像它应该的那样被释放。否则std :: vector是要走的路。所有这些都可能有例外。

浮云间

原始字符串用法是的,有时你真的可以做到这一点。当使用const char *,在堆栈上分配的char数组和字符串文字时,你可以这样做,根本没有内存分配。编写此类代码通常需要比使用字符串或向量更多的思考和关注,但使用适当的技术可以完成。使用适当的技术,代码可以是安全的,但是您总是需要确保在复制到char []时,您要么对要复制的字符串的长度有一些保证,要么优雅地检查和处理超大字符串。不这样做是因为这些功能系列的功能不安全。模板如何帮助编写安全的char缓冲区至于char []缓冲区的安全性,模板可以提供帮助,因为它们可以创建一个封装来为您处理缓冲区大小。像这样的模板是由Microsoft实现的,以便为strcpy提供安全的替换。这里的例子是从我自己的代码中提取的,真正的代码有很多方法,但这应该足以传达基本思想:template <int Size>class BString{&nbsp; char _data[Size];&nbsp; public:&nbsp; BString()&nbsp; {&nbsp; &nbsp; _data[0]=0;&nbsp; &nbsp; // note: last character will always stay zero&nbsp; &nbsp; // if not, overflow occurred&nbsp; &nbsp; // all constructors should contain last element initialization&nbsp; &nbsp; // so that it can be verified during destruction&nbsp; &nbsp; _data[Size-1]=0;&nbsp; }&nbsp; const BString &operator = (const char *src)&nbsp; {&nbsp; &nbsp; strncpy(_data,src,Size-1);&nbsp; &nbsp; return *this;&nbsp; }&nbsp; operator const char *() const {return _data;}};//! overloads that make conversion of C code easier&nbsp;template <int Size>inline const BString<Size> & strcpy(BString<Size> &dst, const char *src){&nbsp; return dst = src;}
随时随地看视频慕课网APP
我要回答