为什么 C++ 可以返回 Vector 局部变量
vector与动态数组性质相同。
具体数据存放在堆区。
变量名存放在栈区。
变量名中存放的是堆区的首地址。
C++语言中,所有new
和malloc
创建的变量均存放在堆区,这已经是一个共识。但是鲜为人知的是,STL库中的容器虽没有经过这两个关键字创建,但同样是存放在堆区。这与动态数组性质相同。如果从汇编角度观察便会发现,容器均调用了allocator
来创建。这里便不展开多言。
在下面的例子中,fun()
函数和main()
函数中,两个vec
的地址并不相同,而首元素的首地址却相同。这就和new
创建出的动态数组一样。
Fig. 1. 运行现象
下面的图可能会更容易让人理解。
Fig. 2. 存放关系示意图
既然vector是在堆区创建,那么必然会遇到未释放堆内存导致内存泄漏。如何释放vector内存呢?
C++本身提供了一个clear()
函数,可以清除容器中所有元素。但是此函数并不能释放掉vector
的capacity
空间。如果想释放掉所有空间,需使用swap()
函数,使用方法如下,若想详细了解释放vector
内存,可以参照这位前辈的文章点这里。
如有陈述纰漏,还望前辈不吝指教。
版权声明: 本文为 InfoQ 作者【韩小非】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc30c36a64ed67985cf7c8da1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论