• 我分析内存泄漏的一道作业题,已解决


      1 /*
      2 要求: 1. 定义一个整数集合类 Set,要求该类包含如下属性和操作:
      3 属性:
      4 ① 元素表属性 member[SETSIZE]:是从 0 … SETSIZE –1 范围内的整数中选出 的元素表,其中 SETSIZE 指定整数元素值和表中可以容纳的元素个数的范围,
      5 例如,可以在类外定义: const int SETSIZE = 500;。 注意,元素表 member 的元素值只有两种状态(非 true 即 false)。如果元素 n 对应的元素表的元素值为真(true),
      6 则表示 n 在集合中,即 n∈X 当且仅当 member[n] 为真。 例如,集合 X = {1,4,5,7}对应的元素表中,只有元素 member[1],member[4], member[5],member[7]为真,
      7 而其余元素均为假。
      8 操作:
      9 ① 构造函数:构造 Set 类对象分两种情况:
     10 ·如果不通过参数传递初值,则在集合对象的构造过程中,元素表 member 的各 个元素被缺省设置为 false,即空元素表。
     11 ·如果将一个整型数组 a[]和数组的元素个数 n 作为参数传递初值,则在集合对象 的构造过程中,元素表中由数组 a[]的元素值作为下标的元素值被设置为 true,
     12 而其他元素设置为 false。
     13 ② 插入元素操作 Insert:通过参数将一个在 0 … SETSIZE –1 范围内的整数 n 插 入集合中,即 member[n] = true。
     14 ③ 删除元素操作 Delete:通过参数将一个在 0 … SETSIZE –1 范围内的整数 n 从集合中删除,即 member[n] = false。
     15 ④ 并集运算操作 operator+:将两个 Set 对象表示的整数集合进行并集运算,并返 回结果集合。
     16 ⑤ 交集运算操作 operator*:将两个 Set 对象表示的整数集合进行交集运算,并返 回结果集合。
     17 ⑥ 属于集合运算操作 operator^:判断一个整数元素是否属于一个指定的 Set 对象 表示的整数集合,并返回结果标志(非 true 即 false)。
     18 被判断的整数元素和整数 集合通过参数传递给操作。
     19 ⑦ 输出操作:通过标准输出流 cout,按集合的表示格式输出显示整数集合
     20 */
     21 #include<iostream>
     22 #include <crtdbg.h>
     23 using namespace std;
     24 class Set
     25 {
     26     int *member;
     27     int SETSIZE;//存放数组a中最大的整型元素
     28     int *a;
     29     int an;
     30 public:
     31     Set() { a = 0; member = 0; }
     32     Set(int n, int p[]);
     33     Set(int n) { member = 0; a = new int[n]; }
     34     void Insert(unsigned int n);
     35     void Delete(unsigned int n);
     36     int* geta() { return a; }
     37     friend Set operator+(Set x, Set y);//并集
     38     friend Set operator*(Set x, Set y);//交集
     39     bool operator^(int op);
     40     void showa();
     41     void showm();
     42     void Delete() { delete[]a; delete[]member; }
     43     //~Set() { delete []a; delete []member; }//两个友元函数中定义了实例对象,由编译器析构的话,对象的内存不存在,
     44     //计算得出的集合也就无法输出
     45 };
     46 bool Set::operator^(int op)
     47 {
     48     for (int i = 0; i < an; i++)
     49         if (a[i] == op)
     50             return true;
     51     return false;
     52 }
     53 void Set::showa()
     54 {
     55     for (int i = 0; i < an; i++)
     56         cout << a[i] << endl;
     57 }
     58 void Set::showm()
     59 {
     60     for (int i = 0; i < SETSIZE; i++)
     61         cout << member[i] << endl;
     62 }
     63 Set::Set(int n, int p[])
     64 {
     65     int max = p[0];
     66     for (int i = 0; i < n; i++)
     67         if (p[i]>max)
     68             max = p[i];
     69     SETSIZE = max + 1;//多一个放0 
     70     member = new int[SETSIZE];
     71     an = 0;
     72 
     73     for (int i = 0; i < SETSIZE; i++)
     74         member[i] = 0;
     75     for (int i = 0; i < SETSIZE; i++)
     76         for (int j = 0; j < n; j++)//right
     77             if (i == p[j])
     78                 member[i] = 1;
     79     for (int i = 0; i < SETSIZE; i++)
     80         if (member[i])
     81             an++;
     82 
     83     a = new int[an];
     84     int ai = 0;
     85     for (int i = 0; i < SETSIZE; i++)//错误在这里,已改正
     86         if (member[i])
     87         {
     88             a[ai] = i;
     89             ai++;
     90         }
     91     //delete[]p;
     92 
     93 }
     94 void Set::Insert(unsigned int n)
     95 {
     96     if (n <= SETSIZE)
     97         member[n] = 1;
     98     else
     99         cout << "溢出错误!" << endl;
    100 }
    101 void Set::Delete(unsigned int n)
    102 {
    103     if (n <= SETSIZE)
    104         member[n] = 0;
    105     else
    106         cout << "不存在你要删除的对象!" << endl;
    107 }
    108 Set operator+(Set x, Set y)
    109 {
    110     int suman = x.an + y.an;
    111     int *tran = new int[suman];
    112     for (int i = 0; i < x.an; i++)
    113         tran[i] = x.a[i];
    114     for (int i = x.an; i < suman; i++)
    115         tran[i] = y.a[i - x.an];
    116     Set t(suman, tran);
    117     return t;
    118 }
    119 Set operator*(Set x, Set y)
    120 {
    121     int minan;
    122     x.an < y.an ? minan = x.an : minan = y.an;
    123     int*p = new int[minan];
    124     int mi = 0;
    125     for (int i = 0; i <x.an; i++)
    126         for (int j = 0; j < y.an; j++)
    127             if (x.a[i] == y.a[j])
    128             {
    129                 p[mi] = x.a[i];
    130                 mi++;
    131             }
    132     
    133     int*np = new int[mi];
    134     for (int i = 0; i < mi; i++)
    135         np[i] = p[i];
    136     //delete[]p;//嗯,在函数体中,应该调用完毕就撤销了内存吧?
    137     Set t(mi, np);
    138     return t;
    139 }
    140 int main()
    141 {
    142     int n;
    143     cin >> n;
    144     int *p = new int[n];
    145     for (int i = 0; i < n; i++)
    146         cin >> p[i];
    147     Set A(n, p);
    148     cout << "判断" << A.operator^(3) << endl;
    149     //delete[]p;//成功人肉delete
    150     cin >> n;
    151     int *t = new int[n];
    152     for (int i = 0; i < n; i++)
    153         cin >> t[i];
    154     cout << endl;
    155     Set B(n, t);
    156     //delete[]t;//成功人肉delete
    157     Set C = A + B;
    158     C.showa();
    159     cout << endl;
    160     Set D = A*B;
    161     D.showa();
    162     //A.Delete();
    163     //B.Delete();
    164     //C.Delete();
    165     //D.Delete();
    166     
    167     _CrtDumpMemoryLeaks();//这个函数不干活啊= =,莫非不是输出使用?
    168     return 0;
    169 }
  • 相关阅读:
    hdu 2492 树状数组 Ping pong
    HDU 1532 基础EK Drainage Ditches
    EK算法模板
    Codeforces Round #538 (Div. 2) (A-E题解)
    Codeforces Global Round 1 (A-E题解)
    Educational Codeforces Round 59 (Rated for Div. 2) DE题解
    Codeforces Round #535 (Div. 3) 题解
    Codeforces Round #534 (Div. 2) D. Game with modulo(取余性质+二分)
    POJ2253:Frogger(改造Dijkstra)
    POJ1797:Heavy Transportation(改造Dijkstra)
  • 原文地址:https://www.cnblogs.com/yuelien/p/5402204.html
Copyright © 2020-2023  润新知