我正在一个项目中,在该项目中我使用前向列表和向量,并输出它们的值。 前向列表是Frame对象的列表,向量是Display对象的向量。 问题在于,在InsertFrame()创建对象之后,向量的值会丢失并实际上变成垃圾。 我可以在调试器中看到它在函数结束后立即发生,这使我相信它与变量超出范围 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
为foo()中的map<int , std::vector<int>> m1
分配局部变量向量,希望s1的值一旦超出范围就无法访问。 但事实并非如此。 看起来矢量中的元素存储在堆内存中,而局部变量s1存储在堆栈中。 当s1存储在map中时,它似乎分配了一个新的堆内存并将值复制到其中。 我的理解正确吗? 我在foo中打印每个矢量元素的地址,也在map中打印每个矢量元素的地址。
#include <iostream>
#include <map>
#include <set>
#include<vector>
using namespace std;
std::map<int , std::vector<int>> m1;
void foo(){
vector<int> s1 = { 10, 20, 30, 40 };
cout << "local var address: " << &s1 << "\n";
cout << "Element address " << &s1[0] << " " << &s1[1] << " "
<< &s1[3] << " " << &s1[4] << "\n";
m1[1] = s1;
}
int main() {
foo();
cout << "\nElement value and address in map:\n";
for (auto it = m1[1].begin(); it != m1[1].end();it++) {
cout << *it << " " << &m1[1][*it] << "\n";
}
return 0;
}
output:
local var address: 0x7fff41714400
Element address 0xc07c20 0xc07c24 0xc07c2c 0xc07c30
Element value and address in map:
10 0xc08cc8
20 0xc08cf0
30 0xc08d18
40 0xc08d40
当您执行m1[1] = s1;
,您正在调用m1[1]
的赋值运算符 。 如果您点击该链接,则表示您正在调用第一个实例,cppreference描述为:
1)复制分配运算符。 用其他内容的副本替换内容。
(强调我的)
因此,您正在查看两个完全不同的向量和两个完全不同的项目集的地址。 比较它们没有任何意义。
std::map<int , std::vector<int>>
的value_type
为std::vector<int>
。 这意味着存储在地图中的每个项目都包含这样的矢量对象。
它不包含对矢量的引用或指向矢量的指针,它实际上是一个对象。
这意味着,如果您在地图外部创建矢量,并将其分配给地图元素,则必须将其移动或复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.