为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
跃然一笑 2019-08-31 15:33:13
我std::string什么时候应该使用,什么时候应该char*用来管理charC ++中的s 数组?似乎你应该使用char*性能(速度)是至关重要的,并且由于内存管理,你愿意接受一些有风险的业务。是否还有其他需要考虑的方案?
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

你可以通过引用传递std :: strings如果它们很大以避免复制,或者指向实例的指针,所以我没有看到使用char指针的任何真正优势。

我使用std :: string / wstring来获取或多或少的实际文本。char *虽然它对其他类型的数据很有用,但你可以确定它会像它应该的那样被释放。否则std :: vector是要走的路。

所有这些都可能有例外。


查看完整回答
反对 回复 2019-08-31
?
浮云间

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;

}


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信