堆栈std ::矢量范围

时间:2012-12-28 10:37:47

标签: c++ vector scope return-value

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

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

但据我所知,'myVector'是在堆栈上创建的对象,所以当函数结束时它不会超出范围吗?它的析构函数什么时候被调用? 我知道关于返回向量的其他问题很少,但我需要澄清这个具体点,希望不要重复一个问题。

3 个答案:

答案 0 :(得分:11)

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

vector<int> myFunc()

返回myVector副本,因此它已经超出范围并不重要,因为它已经被复制用于返回。

但是,如果您将其更改为

vector<int> & myFunc()

现在你告诉它不要复制myVector而你会遇到一个名为悬空参考的问题,因为myVector会被破坏,你不会复制它仍然试着用它。

答案 1 :(得分:1)

您的代码返回堆栈上myVector实例的副本。所以它可以超出范围并被删除(返回后)。

答案 2 :(得分:0)

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

类似于:

vector<int> a;
vector<int> b;

... fill in vector a with stuff ... 

b = a;