这是我的代码。如果我使用ELEM struct的引用,我的地图将为空,否则我得到正确的值:
#include <cmath>
#include <cstdio>
#include <stack>
#include <map>
#include <iostream>
#include <string>
using namespace std;
struct ELEM;
struct ELEM {
map<string, ELEM> Children;
map<string, string> Attributes;
};
int main() {
stack<ELEM> elements;
ELEM root;
elements.push(root);
ELEM elem1;
elements.push(elem1);
elements.top().Attributes["attr1"] = "val1";
elements.top().Attributes["attr2"] = "val2";
ELEM &elem2 = elements.top(); // here is the problem ???
elements.pop();
elements.top().Children["child1"] = elem2;
cout << elements.top().Children["child1"].Attributes.size() << endl;
// i get '0'
return 0;
}
你能解释一下,问题是什么? 感谢
答案 0 :(得分:0)
使用&
:
ELEM &elem2 = elements.top();
elements.pop();
elem2
是对elem1
的引用。在第二行调用pop()
从堆栈中删除elem1
并销毁它,使elem2
和悬空引用。调用elem2.Attributes.size()
会返回恰好已为您返回0
,因为elem2
引用已被销毁的elem1
。0
,但行为未定义 - 不能保证会发生什么(感谢Caleth指出这一点)。
没有&
:
ELEM elem2 = elements.top();
elements.pop();
elem2
是elem1
的副本,即它是一个新的ELEM
实例,其值已设置为与elem1
相同的值。调用pop()
会从堆栈中删除elem1
并将其销毁,与之前相同,但elem2
仍然存在。调用elem2.Attributes.size()
会返回2
,因为elem2
是(现已销毁的)elem1
的副本。