Bootstrap

为什么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便是需要清空的容器。

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