为什么在C++中更喜欢char*而不是string?

Jic*_*hao 11 c c++ string

我是一个试图编写c ++代码的C程序员.我听说string在C++中比char*在安全性,性能等方面更好,但有时它似乎char*是一个更好的选择.有人建议程序员不要char*在C++中使用,因为我们可以做所有char*可以用字符串做的事情,而且它更安全,更快.

你曾经用过char*C++吗?具体条件是什么?

Cha*_*via 27

它使用起来更安全,std::string因为您不必担心为字符串分配/释放内存.C++ std::string类可能在char*内部使用数组.但是,该类将为您管理内部数组的分配,重新分配和释放.这消除了使用原始指针所带来的所有常见风险,例如内存泄漏,缓冲区溢出等.

此外,它也非常方便.您可以复制字符串,附加到字符串等,而无需手动提供缓冲区空间或使用strcpy/strcat等函数.使用std :: string就像使用=+运算符一样简单.

基本上,它是:

 std::string s1 = "Hello ";
 std::string s2 = s1 + "World";
Run Code Online (Sandbox Code Playgroud)

与...

 const char* s1 = "Hello";
 char s2[1024]; // How much should I really even allocate here?
 strcpy(s2, s1);
 strcat(s2, " World ");
Run Code Online (Sandbox Code Playgroud)

编辑:

回应你对char*C++中使用的编辑:许多C++程序员声称你永远不应该使用它,char*除非你正在使用一些需要它的API /遗留函数,在这种情况下你可以使用std::string::c_str()函数转换std::stringconst char*.

但是,我想说在C++中有一些C数组的合法用法.例如,如果性能绝对至关重要,则堆栈上的小型C阵列可能是更好的解决方案std::string.您可能还在编写一个程序,您需要绝对控制内存分配/释放,在这种情况下您将使用char*.另外,正如评论部分所指出的,std::string不能保证为您提供连续的可写缓冲区*,因此std::string如果您需要程序完全可移植,则无法直接从文件写入.但是,如果您需要这样做,std::vector仍然可能更喜欢使用原始C阵列.


*虽然在C++ 11中这已经改变,std::string但它确实为您提供了连续的缓冲区

  • @earlz:我认为调用一个函数(`std :: string :: c_str()`)相当简单. (17认同)
  • 使用char*而不是string的一个简单原因是,如果必须避免动态内存分配(即可能在中断处理程序或嵌入式系统中). (3认同)
  • 我认为所有的例外都归结为,如果你知道你必须使用char*.如果你没有充分的理由(大部分时间没有),请使用std :: string. (3认同)
  • 那个std :: string使得很难不可能得到一个可写缓冲区是一个问题---你必须依赖于实现细节(这个问题被解释为标准实际上是否需要&s [0]才能工作它适用于矢量),或者用字符串混合另一个容器(矢量或字符数组). (2认同)
  • 另一个更喜欢char*over std :: string的特定实例是需要静态字符串常量的地方.如果有静态std :: string实例(在cpp文件中或作为静态类成员),那么您可能会遇到初始化顺序问题.使用原始char*可以避免此问题. (2认同)

Fre*_*son 5

好吧,自从我第一次回答以来,问题发生了很大变化.

与std :: string相比,Native char数组是内存管理和缓冲区溢出的噩梦.我总是喜欢使用std :: string.

也就是说,由于性能限制,char数组在某些情况下可能是更好的选择(虽然std :: string实际上可能在某些情况下更快 - 先测量!)或禁止在嵌入式环境中使用动态内存等.