如何解决c ++ auto variable(map)被分配垃圾值
我尝试按如下方式分配“a”变量:
for (auto& a : getMap()[1])
将垃圾值分配给 a
。但是如果我像下面这样先声明变量后使用它,它可以正常工作。
auto vv = getMap()[1];
for (auto& a : vv)
如果我直接使用它而不声明变量,为什么会出现问题?
#include <string>
#include <map>
#include <memory>
#include <vector>
using namespace std;
typedef struct _mystruct {
} mystruct;
map<int,vector<shared_ptr<mystruct>>> mymap;
void init() {
vector<shared_ptr<mystruct>> v;
v.push_back(make_shared<mystruct>(mystruct()));
mymap[1] = v;
}
map<int,vector<shared_ptr<mystruct>>> getMap() {
return mymap;
}
int main()
{
init();
vector<shared_ptr<mystruct>> v2;
for (auto& a : getMap()[1]) {
v2.push_back(a);
}
auto vv = getMap()[1];
for (auto& a : vv) {
v2.push_back(a);
}
return 0;
}
解决方法
直到 C++17(从那时起改变的细节不会改变答案)基于范围的 for 循环等效于(取自 cppreference):
body{
background:url("?../img/by.jpg") no-repeat;
background-size:cover;
因为您的 {
auto && __range = range_expression ;
for (auto __begin = begin_expr,__end = end_expr; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
返回地图的副本,所以:
getMap
是对地图临时副本中元素的引用,该元素在此语句结束时被销毁。 auto&& __range = getMap()[1];
然后持有一个悬空引用。无论如何,您可能不想复制整个地图只是为了迭代其中的一个元素,返回一个(常量)引用而不是来自 __range
的副本将解决这个问题。
当你写作时:
getMap
那么 auto vv = getMap()[1];
是地图中向量的副本。因此,在这种情况下没有悬空引用。
基于范围的循环是这样的:
boolean
其中 {
auto && __range = range_expression ;
for (auto __begin = begin_expr,__end = end_expr; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
在您的代码中是 range_expression
。但问题是 getMap()[1]
是一个临时变量,它的生命周期会在 getMap()[1]
之后结束。所以范围循环一般都会失效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。