3 回答
TA贡献1799条经验 获得超9个赞
你可以通过引用传递std :: strings如果它们很大以避免复制,或者指向实例的指针,所以我没有看到使用char指针的任何真正优势。
我使用std :: string / wstring来获取或多或少的实际文本。char *
虽然它对其他类型的数据很有用,但你可以确定它会像它应该的那样被释放。否则std :: vector是要走的路。
所有这些都可能有例外。
TA贡献1829条经验 获得超4个赞
原始字符串用法
是的,有时你真的可以做到这一点。当使用const char *,在堆栈上分配的char数组和字符串文字时,你可以这样做,根本没有内存分配。
编写此类代码通常需要比使用字符串或向量更多的思考和关注,但使用适当的技术可以完成。使用适当的技术,代码可以是安全的,但是您总是需要确保在复制到char []时,您要么对要复制的字符串的长度有一些保证,要么优雅地检查和处理超大字符串。不这样做是因为这些功能系列的功能不安全。
模板如何帮助编写安全的char缓冲区
至于char []缓冲区的安全性,模板可以提供帮助,因为它们可以创建一个封装来为您处理缓冲区大小。像这样的模板是由Microsoft实现的,以便为strcpy提供安全的替换。这里的例子是从我自己的代码中提取的,真正的代码有很多方法,但这应该足以传达基本思想:
template <int Size>
class BString
{
char _data[Size];
public:
BString()
{
_data[0]=0;
// note: last character will always stay zero
// if not, overflow occurred
// all constructors should contain last element initialization
// so that it can be verified during destruction
_data[Size-1]=0;
}
const BString &operator = (const char *src)
{
strncpy(_data,src,Size-1);
return *this;
}
operator const char *() const {return _data;}
};
//! overloads that make conversion of C code easier
template <int Size>
inline const BString<Size> & strcpy(BString<Size> &dst, const char *src)
{
return dst = src;
}
- 3 回答
- 0 关注
- 575 浏览
添加回答
举报