2013-08-19 30 views
1

我知道动态内存比设置一个固定大小的数组和使用它的一部分具有优势。但是在动态内存中,您必须输入要存储在数组中的数据量。使用字符串时,可以根据需要键入尽可能多的字母(甚至可以使用字符串来输入数字,然后使用函数将其转换)。这个事实让我觉得与字符串相比,字符数组的动态内存已经过时了。字符串如何在C++中分配内存?

所以我想知道什么是使用字符串的优点和缺点?字符串占用的空间何时被释放?也许选择释放你的动态分配的内存与删除字符串的优势?请解释。

+0

字符串不是魔术。他们只是一个图书馆功能。 –

+0

@KerrekSB:但它比使用自己的动态内存'char *'代码更好! –

+0

@MatsPetersson:是的,当然,但是“动态分配内存vs字符串”的OP表达式是错误的二分法。字符串*是*(通常)动态容器。 –

回答

3

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

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

字符串的优点是灵活性(自动增加大小)和安全性(难以超越数组边界)。由于不需要动态分配,因此堆栈中的固定大小的char数组速度更快。但是如果你有性能问题,而不是之前你应该担心。

6

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

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

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

1

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

  • ,如果你需要创建一个包含一个句子,然后您可以将字符串, 这很好,不要使用malloc
  • 如果你想要一个数组和“玩”与它意味着更改或设置单元格按某种方法,或更改它的大小,然后启动它与malloc将是适当的方式
  • 我看到一个静态分配char a[17](例如)的唯一原因是为单你需要的专用字符串,只有当你知道你需要的确切尺寸时,这意味着它不会改变

,一个很重要的一点找到了我:

在动态分配内存,如果内存被不断分配,但分配给该未使用的对象之一,没有被释放,那么它可能会导致堆栈溢出情况或内存泄漏这是一个很大的缺点。

+2

咦?我不知道你在说什么,更重要的是,在这个特定的上下文中提到堆栈溢出的目的是什么。 –

+0

@MatsPetersson但是!但! Stackoverflow真棒! – sehe