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