字符串如何在c ++中分配内存?

时间:2013-08-19 11:26:54

标签: c++ string dynamic-memory-allocation

我知道动态内存优于设置固定大小的数组并使用其中的一部分。但是在动态内存中,您必须输入要存储在数组中的数据量。使用字符串时,您可以根据需要键入任意数量的字母(甚至可以使用字符串表示数字,然后使用函数转换它们)。这个事实让我觉得与字符串相比,字符数组的动态内存已经过时了。

所以我想知道使用字符串时有哪些优点和缺点?字符串占用的空间何时释放?是否可以通过删除优先于字符串的优势来释放动态分配的内存?请解释一下。

3 个答案:

答案 0 :(得分:6)

简短的回答是"不,没有缺点,只有优点" std::string超过字符数组。

当然,字符串会使用动态内存,它只是隐藏了幕后的事实,因此您不必担心它。

回答你的问题:字符串占用的空间何时被释放? this帖子可能会有帮助。基本上,std::string一旦超出范围就会被释放。编译器通常可以决定何时分配和释放内存。

答案 1 :(得分:3)

std :: string通常包含一个内部动态分配的缓冲区。分配数据时,或者如果推回新数据,并且当前缓冲区大小不足,则会分配一个增加大小的新缓冲区,并将旧数据复制或移动到新缓冲区。然后释放旧缓冲区。

当字符串超出范围时,将释放主缓冲区。如果字符串对象是函数中的局部变量(在堆栈上),它将在当前代码块的末尾解除分配。如果它是一个函数参数,当函数退出时。如果它是一个类成员,那么每当类被销毁时。

字符串的优点是灵活性(自动增加大小)和安全性(更难超越数组的范围)。堆栈上的固定大小的char数组更快,因为不需要动态分配。但是如果你遇到性能问题,你应该担心,而不是之前。

答案 2 :(得分:1)

好吧,你的问题让我思考,然后我明白你在谈论语法差异,因为两种方式都是动态分配char数组。唯一的区别在于:

  • 如果你需要创建一个包含句子的字符串,那么你可以,和 那很好,不要使用malloc
  • 如果你想要一个数组并“玩”它,意味着根据某种方法改变或设置单元格,或改变它的大小,那么用malloc启动它将是合适的方式
  • 我看到静态分配char a[17](例如)的唯一原因是你需要的单一用途字符串,这意味着只有当你知道你需要的确切大小时它才会改变< / LI>

我发现了一个重点:

在动态内存分配中,如果内存正在被连续分配但是为未使用的对象分配的内存未被释放,那么它可能导致堆栈溢出情况或内存泄漏,这是一个很大的缺点。