我的大小为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;
}
答案 0 :(得分:44)
&a
内的func
是本地参数a
的地址,而不是原始变量的地址(a
,b
,{{1 }}或c
),其中:
d
; func
的范围的末尾(此处为a
的结尾),就会变为无效指针。在你的情况下,由于你连续4次调用func
什么都不做,这个参数的地址碰巧没有改变,这就是为什么你得到一个大小为1(你插入相同的指针4)次)。
此行为为implementation defined(感谢@ Rakete1111),因为集合需要比较无效指针。
通过func
或s1
(例如s2
)访问指向的元素是不确定的行为。
答案 1 :(得分:28)
参数a
按值传递,这意味着您要插入的是从参数复制的本地参数的地址。每次调用a
时,都会构建func
,其地址可能相同或不同;没有任何保证。
值得注意的是,当退出函数时,参数a
将被销毁,然后插入的指针将被悬空。
你应该让它通过引用传递,然后是{{1}中的参数地址(即变量a
,b
,c
,d
}})将被插入。这些地址不同,不会悬挂在main()
的正文中。
main()