C++ 将地址插入集合时,集合的大小比预期的小

C++ 将地址插入集合时,集合的大小比预期的小,c++,set,C++,Set,我要一号的。不是应该是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);

我要一号的。不是应该是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;
}
void func(set&s1,set&s2,int a)
{
s1.插入(&a);
s2.插入(&a);
}
int main()
{
设置s1、s2;
INTA=1,b=2,c=3,d=4;
func(s1,s2,a);
func(s1,s2,b);
func(s1,s2,c);
func(s1,s2,d);

cout
&a
内部
func
是局部参数
a
的地址,而不是原始变量(
a
b
c
d
)的地址,其中:

  • 可以在
    func
    的不同调用之间获取各种类型的值
  • 一旦到达声明
    a
    的作用域的末尾(此处为
    func
    的末尾),指针将变为无效指针
  • 在您的情况下,由于您只需在一行中调用
    func
    4次,因此此参数的地址不会发生更改,这就是为什么您的大小为1(插入相同的指针4次)

    由于集合需要比较无效的指针,所以这种行为是错误的(感谢@Rakete1111)


    通过
    s1
    s2
    访问指向的元素(例如
    **s1.begin()
    )是未定义的行为。

    参数
    a
    通过值传递,这意味着您插入的是从参数复制的本地参数的地址。
    a
    将在每次调用
    func
    时构造,它们的地址可能相同或不同;没有任何保证

    值得注意的是,参数
    a
    在退出函数时将被销毁,然后插入的指针将被挂起

    您应该通过引用传递,然后插入参数的地址(即
    main()
    中的变量
    a
    b
    c
    d
    ),这些地址是不同的,不会挂在
    main()
    的主体中

    void func(set&s1、set&s2、int&a)
    {
    s1.插入(&a);
    s2.插入(&a);
    }
    

    @Holt看起来像是。@Rakete1111谢谢,我不知道。我已经更新了答案。真的吗?3人认为这个问题应该结束,因为它“似乎与编程无关”?令人惊讶的是,GCC(
    g++-W-Wall-Wextra-Werror
    )和Clang在没有任何警告的情况下编译了这段代码。@user200783“…在中定义的范围内。”这既不是“无法再复制的问题”也不是“简单的印刷错误”。投票重新开始。
    void func(set<int*>& s1, set<int*>& s2, int& a)
    {
        s1.insert(&a);
        s2.insert(&a);
    }