7

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

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

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

4

3 回答 3

14

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

vector<int> myFunc()

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

但是,如果您将其更改为类似

vector<int> & myFunc()

现在你告诉它不要复制myVector,你会遇到一个叫做悬空引用的问题,因为myVector它会被破坏,你不复制它,但仍然尝试使用它。

于 2012-12-28T10:42:19.320 回答
1

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

于 2012-12-28T10:41:24.937 回答
0

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

如同:

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

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

b = a; 
于 2012-12-28T10:42:05.513 回答