std :: string和const char *

时间:2015-02-28 16:48:53

标签: c++ string memory-management

如果我使用

const char * str = "Hello";

运行时

中不需要内存分配/解除分配

如果我使用

const std::string str = "Hello";

是否会在字符串类中通过new / malloc进行分配?我可以在集会中找到它,但我不擅长阅读它。

如果答案是"是的,会有malloc / new",为什么?为什么只能在std :: string里面传入内部const char指针并在需要编辑编辑字符串时进行实际的内存分配?

3 个答案:

答案 0 :(得分:5)

  

是否会在string类中通过new / malloc进行分配?

这取决于。 string对象必须提供一些内存来存储数据,因为这是它的工作。一些实现使用“小字符串优化”,其中对象包含一个小缓冲区,并且只有在字符串太大的情况下才从堆中分配。

  

为什么只能在std::string内传递到内部const char指针并在需要编辑编辑字符串时进行实际的内存分配?

您描述的内容不一定是优化(因为每当您修改字符串时都需要额外的运行时检查),并且在任何情况下迭代器失效规则都不允许这样做。

有一个string_view的提案,允许您使用const string之类的接口访问现有字符序列,而无需任何内存管理。它还不是标准的,也不允许你修改字符串。

答案 1 :(得分:1)

std::string的天真实现将需要堆分配,但是如果在运行时未修改初始化字符串,则允许编译器通过用替代实现的对象替换它们来优化静态初始化的std::string对象。 p>

在实例化不可变字符串时可以使用const std::string以确保更好的优化。

答案 2 :(得分:0)

C ++标准实际上并没有说你不能只存储指向外部字符串(和长度)的指针。但是,这意味着每次修改字符串(例如char& std::string::operator[](size_t index))都必须确保字符串实际上是可写的。由于大量的字符串用法不仅仅使用常量字符串来存储字符串,而且确实修改了字符串[或者使用不是常量输入的字符串]。

所以,有些问题是;

std::string s = "Hello";
char &c = s[1]; 
c = 'a';    // Should make string to "Hallo". 

如果:

char buffer[1000];
cin.getline(buffer);   // Reads "Hello"
std::string s = buffer;
cin.getline(buffer);   // Reads "World"

现在s的价值是多少?

有很多这样的情况,如果你只是复制原始字符串,会导致更多问题,很少或没有任何好处。