「已注销」 2019-07-14 07:12 采纳率: 0%
浏览 1498

C++static变量的销毁问题

template <typename T>
class SetClass
{
public:
    const static int MAXSIZE;
    SetClass(void);
    SetClass(const T *a, int n);
    ~SetClass(void);
    bool IsInSet(const T &e) const;
    bool Insert(const T &e);
    bool Delete(const T &e);
    void Display(void) const;
    SetClass<T> &Union(const SetClass<T> &S) const;
    SetClass<T> &Intersection(const SetClass<T> &S) const;
    SetClass<T> &Difference(const SetClass<T> &S) const;
private:
    int *data;
    int n;
};

template <typename T>
SetClass<T> &SetClass<T>::Union(const SetClass<T> &S) const
{
    static SetClass<T> R;

    for (int i = 0; i < n; ++i)
    {
        R.Insert(data[i]);
    }

    for (int i = 0; i < S.n; ++i)
    {
        if (!R.IsInSet(S.data[i]))
        {
            R.Insert(S.data[i]);
        }
    }

    return R;
}

这个方法运行正常,但是若将返回值类型改为SetClass < T >,则在调用析构函数销毁static SetClass < T > R时似乎data被销毁了两次发生错误,为什么会出现这种情况,是因为返回值的时候发生了浅拷贝吗?但是为什么返回值类型为SetClass < T >, 并且去掉R的static属性这样却不会出错?

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-07-17 09:55
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划