将地址插入集合中,集合的大小小于预期

时间:2017-07-05 06:03:38

标签: c++ set

我的大小为1.难道不是4吗?我将整数的地址插入集合中。

void func(set<int*>& s1, set<int*>& s2, int a)
{
    s1.insert(&a);
    s2.insert(&a);
}

int main()
{
    set<int*> s1, s2;

    int a = 1, b = 2, c = 3, d = 4;
    func(s1, s2, a);
    func(s1, s2, b);
    func(s1, s2, c);
    func(s1, s2, d);

    cout<<"  s1.size = "<<s1.size()<<"  s2.size = "<<s2.size()<<endl;
}

2 个答案:

答案 0 :(得分:44)

&a内的func是本地参数a的地址,而不是原始变量的地址(ab,{{1 }}或c),其中:

  1. 可以在d;
  2. 的不同来电之间采用各种值
  3. 一旦到达声明func的范围的末尾(此处为a的结尾),就会变为无效指针。
  4. 在你的情况下,由于你连续4次调用func什么都不做,这个参数的地址碰巧没有改变,这就是为什么你得到一个大小为1(你插入相同的指针4)次)。

    此行为为implementation defined(感谢@ Rakete1111),因为集合需要比较无效指针。

    通过funcs1(例如s2)访问指向的元素是不确定的行为。

答案 1 :(得分:28)

参数a按值传递,这意味着您要插入的是从参数复制的本地参数的地址。每次调用a时,都会构建func,其地址可能相同或不同;没有任何保证。

值得注意的是,当退出函数时,参数a将被销毁,然后插入的指针将被悬空。

你应该让它通过引用传递,然后是{{1}中的参数地址(即变量abcd }})将被插入。这些地址不同,不会悬挂在main()的正文中。

main()

LIVE