【发布时间】:2021-02-19 01:35:29
【问题描述】:
我想交换一个全局向量和一个局部向量,我的问题是局部向量在他的堆栈上。交换运算符会通过指针交换两个向量,所以交换后全局向量将指向局部向量,在堆栈上。
离开作用域时,本地向量会被释放,我知道向量的内容被交换了,但是y在栈上,为什么离开后x仍然有效func 范围,y 将在此之后发布。这是怎么做到的?
#include <iostream>
#include <vector>
using namespace std;
vector<int> x = {2, 3, 4};
void func() {
vector<int> y = {1, 2, 3};
cout << "y before: " << &y << endl;
x.swap(y);
cout << "y after: " << &y << endl;
}
int main()
{
cout << "x before: " << &x << endl;
func();
cout << "x after: " << &x << endl;
return 0;
}
【问题讨论】:
-
“为什么下面的代码仍然有效”到底是什么意思? “仍在工作”是什么意思?你预计会发生什么?
-
我知道向量的内容被交换了,但是y在堆栈上,为什么x在离开func作用域后仍然有效,之后y会重新释放。这是怎么做到的?
-
为什么不是“离开功能后有效”?它仍然是全局范围内的对象。交换其内容不会改变这一点。只有在本地范围内的对象,即
y,会在函数范围结束后被销毁。 -
@dahohu527
x没有指向任何地方,因为x不是指针。 -
x包含y以前的内容。x的位置不会改变。如果您将丰田的发动机换成本田的发动机,然后本田(带有丰田的发动机)被开走,您旁边还有一辆丰田,里面装有本田的发动机。本田发动机没有发生任何事情。换了之后,它还在丰田车里。