为什么 C++ 可以返回 Vector 局部变量

用户头像
韩小非
关注
发布于: 2020 年 07 月 05 日
  • vector与动态数组性质相同。

  • 具体数据存放在堆区。

  • 变量名存放在栈区。

  • 变量名中存放的是堆区的首地址。



C++语言中,所有newmalloc创建的变量均存放在堆区,这已经是一个共识。但是鲜为人知的是,STL库中的容器虽没有经过这两个关键字创建,但同样是存放在堆区。这与动态数组性质相同。如果从汇编角度观察便会发现,容器均调用了allocator来创建。这里便不展开多言。



在下面的例子中,fun()函数和main()函数中,两个vec的地址并不相同,而首元素的首地址却相同。这就和new创建出的动态数组一样。



#include <iostream>
#include <vector>
using namespace std;
// 返回一个vector变量,并打印vec的地址和存放在容器中第一个数据的首地址
vector<int> fun() {
vector<int> vec; // 创建vector
vec.push_back(10); // 添加一个元素
cout << "fun():&vec" << &vec << endl;
cout << "fun():&vec[0]" << &vec[0] << endl;
return vec; // 返回vector
}
int main() {
vector<int> vec; // 创建一个vector
vec = fun(); // 接收传来的参数
cout << "----------------------" <<endl;
cout << "main():&vec" << &vec << endl;
cout << "main():&vec[0]" << &vec[0] << endl;
system("pause");
return 0;
}



Fig. 1. 运行现象



下面的图可能会更容易让人理解。

Fig. 2. 存放关系示意图






既然vector是在堆区创建,那么必然会遇到未释放堆内存导致内存泄漏。如何释放vector内存呢?



C++本身提供了一个clear()函数,可以清除容器中所有元素。但是此函数并不能释放掉vectorcapacity空间。如果想释放掉所有空间,需使用swap()函数,使用方法如下,若想详细了解释放vector内存,可以参照这位前辈的文章点这里



vector<int>().swap(vec);   // vec便是需要清空的容器。



如有陈述纰漏,还望前辈不吝指教。



发布于: 2020 年 07 月 05 日 阅读数: 76
用户头像

韩小非

关注

还未添加个人签名 2019.12.23 加入

还未添加个人简介

评论

发布
暂无评论
为什么C++可以返回Vector局部变量