c++ - c++交换全局和局部向量?
问题描述
我想交换一个全局向量和一个局部向量,我的问题是局部向量在他的堆栈上。交换运算符将通过指针交换两个向量,所以交换后全局向量将指向局部向量,即在堆栈上。
当离开作用域时,本地向量将被释放,我知道向量的内容被交换,但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;
}
解决方案
“交换运算符将通过指针交换两个向量” - 的实现细节swap
并不是你真正关心的。但是您似乎对正在交换哪个指针(如果有的话)感到困惑。
我可以肯定地说,指针 &y
不是被交换的。您的func()
调用将在交换前后显示完全相同的指针值,因为y
它是堆栈上的一个对象。同样,&x
which 指向全局范围级别的对象。
在内部vector
,存储值的实际内存可能会被交换,因为两个向量共享相同的(默认)分配器,因此允许简单地切换指针以提高效率。但是持有它们的实际矢量对象绝对不会在内存中切换位置。
如果要检查内存是否被交换,那么可以输出data()
成员函数返回的指针:
cout << "x before: " << x.data() << endl;
x.swap(y);
cout << "x after: " << x.data() << endl;
推荐阅读
- php - PHPOffice/PhpSpreadsheet:重置单元格样式
- spring - 如何将 index.html 映射到 Spring Boot 应用程序中的根上下文?
- mysql - EXISTS 和 JOIN 检查记录是否存在的区别
- .net - Function App 2.0 中的 System.Net.Sockets.SocketException
- notepad++ - 如何在记事本++中删除数字之间的点(。)
- excel - 得到编译器错误(无效的标识符)
- angular - 角共享模块
- android - Android kapt java.lang.UnsatisfiedLinkError Room
- c# - 转换 EqualityComparer
> 进入 EqualityComparer - java - Intellij 无法配置和查看文件