我是c ++的新手,我发现很难理解一些矢量行为。 我试图实现一个函数来返回一个int数组,我发现很多建议使用这样的矢量:
vector<int> myFunc()
{
vector<int> myVector;
//add elements to vector here...
return myVector;
}
但据我所知,'myVector'是在堆栈上创建的对象,所以当函数结束时它不会超出范围吗?它的析构函数什么时候被调用? 我知道关于返回向量的其他问题很少,但我需要澄清这个具体点,希望不要重复一个问题。
答案 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;