我知道动态内存比设置固定大小的数组并使用它的一部分具有优势。但是在动态内存中,您必须输入要存储在数组中的数据量。使用字符串时,您可以键入任意数量的字母(您甚至可以将字符串用于数字,然后使用函数进行转换)。这个事实让我认为字符数组的动态内存与字符串相比已经过时了。
所以我想知道使用字符串有什么优点和缺点?字符串占用的空间什么时候释放?是否可以选择通过删除来释放动态分配的内存优于字符串?请解释。
我知道动态内存比设置固定大小的数组并使用它的一部分具有优势。但是在动态内存中,您必须输入要存储在数组中的数据量。使用字符串时,您可以键入任意数量的字母(您甚至可以将字符串用于数字,然后使用函数进行转换)。这个事实让我认为字符数组的动态内存与字符串相比已经过时了。
所以我想知道使用字符串有什么优点和缺点?字符串占用的空间什么时候释放?是否可以选择通过删除来释放动态分配的内存优于字符串?请解释。
简短的回答是“不,没有缺点,只有优点”std::string
超过字符数组。
当然,字符串确实使用动态内存,它只是隐藏了幕后的事实,因此您不必担心。
回答您的问题:字符串占用的空间何时释放? 这篇文章可能会有所帮助。基本上,std::string
一旦超出范围, s 就会被释放。通常编译器可以决定何时分配和释放内存。
std::string 通常包含一个内部动态分配的缓冲区。当您分配数据时,或者如果您推回新数据,并且当前缓冲区大小不足,则会分配一个增加大小的新缓冲区,并将旧数据复制或移动到新缓冲区。然后释放旧缓冲区。
当字符串超出范围时,主缓冲区被释放。如果字符串对象是函数中的局部变量(在堆栈上),它将在当前代码块的末尾解除分配。如果是函数参数,则函数退出时。如果它是类成员,则每当该类被销毁时。
字符串的优点是灵活性(自动增加大小)和安全性(更难越过数组的边界)。堆栈上的固定大小的 char 数组更快,因为不需要动态分配。但是,如果您有性能问题,您应该担心这一点,而不是之前。
好吧,你的问题让我思考,然后我明白你在谈论语法差异,因为这两种方式都是动态分配 char 数组。唯一的区别在于需要:
malloc
malloc
是合适的方式char a[17]
(例如)的唯一原因是您需要的单一用途字符串,这意味着只有当您知道您需要的确切大小并且它不会改变时我发现了一个重要的点:
在动态内存分配中,如果内存在不断地分配,但分配给未使用对象的内存没有释放,则可能导致堆栈溢出或内存泄漏,这是一个很大的缺点。