堆栈std::vector作用域

Stack std::vector scope

本文关键字:作用域 vector 堆栈 std      更新时间:2023-10-16

我是c++的新手,我发现很难理解一些向量行为。我试图实现一个函数来返回int数组,我发现许多建议使用像这样的向量:

vector<int> myFunc()
{
    vector<int> myVector;
    //add elements to vector here...
    return myVector;
}

但是从我所知道的'myVector'是在堆栈上创建的对象,所以当函数结束时,它是不是超出了作用域?什么时候调用它的析构函数?我知道还有一些关于返回向量的其他问题,但我需要澄清这一点,希望没有重复的问题。

是的,因为myVector是在堆栈上分配的,一旦函数返回,它就会超出作用域。但在这种情况下,这没关系!函数签名是

vector<int> myFunc()

返回myVector副本,所以它超出作用域并不重要,因为它已经被复制返回。

但是如果你把它改成

vector<int> & myFunc()

现在你告诉它不要复制myVector,你会有一个问题,称为悬空引用,因为myVector将被破坏,你不复制它,但仍然尝试使用它

您的代码返回堆栈上myVector实例的副本。所以没关系,它超出了作用域并被删除了(在返回之后)。

它确实超出了作用域,但是当您返回一个类或结构时,编译器会自动为您创建一个副本,以便您的接收对象填充原始对象的内容。

类似于:

vector<int> a;
vector<int> b;
... fill in vector a with stuff ... 
b = a;