c ++为什么要清空我的地图<string,string =“”>如果我使用引用?

时间:2017-11-28 11:15:37

标签: c++ reference

这是我的代码。如果我使用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;
}

你能解释一下,问题是什么? 感谢

1 个答案:

答案 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();

elem2elem1的副本,即它是一个新的ELEM实例,其值已设置为与elem1相同的值。调用pop()会从堆栈中删除elem1并将其销毁,与之前相同,但elem2仍然存在。调用elem2.Attributes.size()会返回2,因为elem2是(现已销毁的)elem1的副本。