为什么C++可以返回Vector局部变量
vector与动态数组性质相同。
具体数据存放在堆区。
变量名存放在栈区。
变量名中存放的是堆区的首地址。
C++语言中,所有和创建的变量均存放在堆区,这已经是一个共识。但是鲜为人知的是,STL库中的容器虽没有经过这两个关键字创建,但同样是存放在堆区。这与动态数组性质相同。如果从汇编角度观察便会发现,容器均调用了来创建。这里便不展开多言。
在下面的例子中,函数和函数中,两个的地址并不相同,而首元素的首地址却相同。这就和创建出的动态数组一样。
#include
#include
using namespace std;
// 返回一个vector变量,并打印vec的地址和存放在容器中第一个数据的首地址
vector fun() {
vector vec; // 创建vector
vec.push_back(10); // 添加一个元素
cout << "fun():&vec" << &vec << endl;
cout << "fun():&vec[0]" << &vec[0] << endl;
return vec; // 返回vector
}
int main() {
vector vec; // 创建一个vector
vec = fun(); // 接收传来的参数
cout << "----------------------" <

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

既然vector是在堆区创建,那么必然会遇到未释放堆内存导致内存泄漏。如何释放vector内存呢?
C++本身提供了一个函数,可以清除容器中所有元素。但是此函数并不能释放掉的空间。如果想释放掉所有空间,需使用函数,使用方法如下,若想详细了解释放内存,可以参照这位前辈的文章。
vector().swap(vec); // vec便是需要清空的容器。
如有陈述纰漏,还望前辈不吝指教。