类中一个求并集的成员函数,该如何处理

类中一个求并集的成员函数
C/C++ code
    IntSet union2(const IntSet& s) const//计算集合的并集
    {
        IntSet bing;//并集先初始化为s
        bing.num=s.num;
        bing.sum=new int[s.num];
        for(int i=0;i<s.num;i++) 
        {
            bing.sum[i]=s.sum[i];
        }
        for(int i=0;i<num;i++)
        {
            int j=0;
            for(;j<s.num;j++)
            {
                if(s.sum[j]==sum[i]) break;
            }
            if(j==s.num&&s.sum[j-1]!=sum[i]) bing.insert(sum[i]);//若sum[i]未在s.sum中出现过则将其加入并集
        }
        return bing;
    }

我一步步的进行调试时发现,在return句前,bing里的值还是正确的,但一运行return立刻变成很怪的值,我猜是不是因为返回了局部变量的地址造成的。但是函数首部要求不能改变两集合的值,我只能在里面新造一个集合啊。郁闷死了。

------解决方案--------------------
C/C++ code

IntSet bing;//并集先初始化为s

//不能把这句放到函数外面吗? 函数里面初始化或者其他什么操作

------解决方案--------------------
IntSet的构造函数,析构函数,还有拷贝构造函数分别是什么样的?

问题应该出在这些函数里
------解决方案--------------------
问题在你的拷贝构造函数没有把内存复制到新的对象里。

在返回之前,你的零时变量是有内容的。由于你返回了局部变量值,而不是引用,所以会c++会调拷贝构造函数,把内容sum的指针传给上层对象,但问题是传递完之后局部对象会被析构,而析构将delete [] sum. 这时你上层的对象是公用同一个sum的,所以你上层对象在函数返回后(局部变量析构后)会得到一个被delete的指针。

修改拷贝构造函数应该就可以了
IntSet(const IntSet& s)
{
num=s.num;
sum=new int[num];
for (int i=0; i<s.num; i++)
sum[i] = s.sum[i];
}