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

Posted

技术标签:

【中文标题】c++中字符串是如何分配内存的?【英文标题】:How do strings allocate memory in c++? 【发布时间】:2013-08-21 04:22:44 【问题描述】:

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

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

【问题讨论】:

字符串并不神奇。它们只是一个库功能。 @KerrekSB:不过还是比使用自己的动态内存好char *代码! @MatsPetersson:是的,当然,但是“动态分配内存与字符串”的 OP 措辞是错误的二分法。字符串(通常)动态容器。 显然我linked you to in chat yesterday的两个答案没有你要的信息?也许您可以更详细地了解您想知道的确切用例。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

简短的回答是“不,没有缺点,只有优点”std::string 优于字符数组。

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

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

【讨论】:

【参考方案3】:

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

如果您需要创建一个包含句子的字符串,那么您可以,并且 没关系,不要使用malloc 如果您想要一个数组并“玩”它,即更改或设置单元格以某种方法或更改其大小,则使用 malloc 启动它是合适的方式 我看到静态分配char a[17](例如)的唯一原因是您需要的单一用途字符串,这意味着只有当您知道您需要的确切大小并且它不会改变时

我发现了一个重要的点:

在动态内存分配中,如果内存在不断地分配,但分配给未使用对象的内存没有释放,则可能导致堆栈溢出或内存泄漏,这是一个很大的缺点。

【讨论】:

嗯?我不知道你在说什么,更重要的是,在这个特定的上下文中提到堆栈溢出的目的是什么。 @MatsPetersson 但是!但! *** 太棒了!

以上是关于c++中字符串是如何分配内存的?的主要内容,如果未能解决你的问题,请参考以下文章

优化动态分配内存的变量

C++中内存分配问题

C++ 中 vector 如何实现内存分配

将动态分配的内存从 C++ 返回到 C

C++ 的向量如何分配内存

C++:编译器如何知道为每个堆栈帧分配多少内存?