我很困惑,为什么静态unordered_map会被清除,如果我通过引用得到它,但是如果我通过指针得到它...(你可以在这里执行代码:http://cpp.sh/4ondg)
是因为当引用超出范围时,它的析构函数会被调用吗?如果是这样,那么第二个获取函数会得到什么?
class MyTestClass {
public:
static std::unordered_map<int, int>& getMap() {
static std::unordered_map<int, int> map;
return map;
}
static std::unordered_map<int, int>* getMapByPointer() {
static std::unordered_map<int, int> map;
return ↦
}
};
int main()
{
// By reference
{
auto theMap = MyTestClass::getMap();
std::cout << theMap.size() << std::endl;
theMap[5] = 3;
std::cout << theMap.size() << std::endl;
}
{
auto theMap = MyTestClass::getMap();
std::cout << theMap.size() << std::endl;
theMap[6] = 4;
std::cout << theMap.size() << std::endl;
}
// By pointer
{
auto theMap = MyTestClass::getMapByPointer();
std::cout << theMap->size() << std::endl;
(*theMap)[5] = 3;
std::cout << theMap->size() << std::endl;
}
{
auto theMap = MyTestClass::getMapByPointer();
std::cout << theMap->size() << std::endl;
(*theMap)[6] = 4;
std::cout << theMap->size() << std::endl;
}
}
答案 0 :(得分:5)
当你这样做时
auto theMap = MyTestClass::getMap();
theMap
的类型推断为std::unordered_map<int, int>
- 不是参考。因此,函数调用返回的引用被复制到局部变量theMap
;当您修改theMap
时,您只需修改此副本。
要存储引用,请将其声明为auto&
:
auto& theMap = MyTestClass::getMap();
然后你将按预期修改原始对象。
答案 1 :(得分:1)
将静态地图分配给局部变量时,无意中会复制静态地图。在:
auto theMap = MyTestClass::getMap();
auto
被推断为std::unordered_map<int, int>
,而不是std::unordered_map<int, int>&
,这会导致从返回的引用中复制初始化新对象。因此,theMap
是与静态地图完全独立的对象。
指针版本没有这个问题,因为类型被推导为指针,因此唯一被复制的是指针值本身,它总是指向同一个(静态)对象。