鱼C论坛

 找回密码
 立即注册
查看: 3003|回复: 8

多了析构函数就报错

[复制链接]
发表于 2012-2-7 16:07:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<iostream>
using namespace std;
class  Vector
{
   friend bool operator ==(Vector v1,Vector v2);
   private:
       int len;
       int *p;
   public:
      Vector(int l)
      {
          len=l;
          p=new int[len];
          int i;
          for(i=0;i<len;i++)
             p[i]=(i+1)*i;
      }
      
     int operator [] (int index)
      {
           return p[index];
      }
      ~Vector()
      {
              delete []p;
      }
};

bool  operator ==(Vector v1,Vector v2)
{
     bool ret=true;
     if(v1.len!=v2.len)
          ret=false;
     int i=0;
     while((i<v1.len) &&(v1[i]==v2[i]))
     {
           i++;
     }  
     if(i!=v1.len)
        ret=false;
     return ret;
}

int main()
{
   Vector v1(5),v2(3);
   if(v1==v2)
      cout<<"v1==v2"<<endl;
   else
      cout<<"v1!=v2"<<endl;
   return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-8 22:14:09 | 显示全部楼层
  1. #include<iostream>
  2. using namespace std;
  3. class Vector;
  4. bool operator ==( Vector& v1,Vector& v2);
  5. class  Vector
  6. {
  7.    friend bool operator ==( Vector& v1,Vector& v2);
  8.    private:
  9.        int len;
  10.        int *p;
  11.    public:
  12.       Vector(int l)
  13.       {
  14.           len=l;
  15.           p=new int[len];
  16.           int i;
  17.           for(i=0;i<len;i++)
  18.              p[i]=(i+1)*i;
  19.       }
  20.       
  21.      int operator [] (int index)
  22.       {
  23.            return p[index];
  24.       }
  25.       ~Vector()
  26.       {
  27.               delete []p;
  28.       }
  29. };

  30. bool  operator ==( Vector& v1,Vector& v2)
  31. {
  32.      bool ret=true;
  33.      if(v1.len!=v2.len)
  34.           ret=false;
  35.      int i=0;
  36.      while((i<v1.len) &&(v1[i]==v2[i]))
  37.      {
  38.            i++;
  39.      }  
  40.      if(i!=v1.len)
  41.         ret=false;
  42.      return ret;
  43. }

  44. int main()
  45. {
  46.    Vector v1(5),v2(3);
  47.    if(v1==v2)
  48.       cout<<"v1==v2"<<endl;
  49.    else
  50.       cout<<"v1!=v2"<<endl;
  51.    return 0;
  52. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-8 22:18:33 | 显示全部楼层
你的class Vector有个指针的数据成员int *p;
某人的拷贝构造函数将对这个成员进行“浅复制”,导致两个对象的p成员指向同一个内存块。对象析构时,改内存会被delete[]两次,所以在第2次delete[]的时候报错。
以上程序将operator==的参数改为引用,避免了参数传递时拷贝构造函数的调用,所以不会有问题。但这不是根本的解决之道,根本的解决办法是你要自己实现拷贝构造函数,实现数据p的“深复制”

关于“浅复制”和“深复制”,你可以baidu下它们的意思。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-9 22:06:43 | 显示全部楼层

非常的谢谢,对了,版主,为什么我的贴子有回信为什么我打开主页登陆时没有消息提示,这几天我还以为我的问题一直没有人理呢!
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-9 22:45:01 | 显示全部楼层
仰望天上的光 发表于 2012-2-8 22:18
你的class Vector有个指针的数据成员int *p;
某人的拷贝构造函数将对这个成员进行“浅复制”,导致两个对象 ...

顺便问一下版主,异常处理中throw抛出 一个对象时,为什么直接用throw 类()格式,没有一个对象,只有一个类?请帮忙解答
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-10 13:40:40 | 显示全部楼层
本帖最后由 仰望天上的光 于 2012-2-10 13:41 编辑
xiang__jie 发表于 2012-2-9 22:45
顺便问一下版主,异常处理中throw抛出 一个对象时,为什么直接用throw 类()格式,没有一个对象,只有一 ...


类 对象名();以缺省构造函数创建一个名字为“对象名”的对象。

类();以缺省构造函数创建一个没有名字的临时对象。
比如你可以写:string()或者vector<int>()都可以得到一个无名的临时对象。
那你也可以先产生一个普通对象,再把它throw出去,如:
MyException  m;
throw m;
和 throw MyEception()效果是一样的。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-10 13:54:54 | 显示全部楼层
仰望天上的光 发表于 2012-2-10 13:40
类 对象名();以缺省构造函数创建一个名字为“对象名”的对象。

类();以缺省构造函数创建一个没有 ...

明白,再谢!
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-11 19:40:41 | 显示全部楼层

#include <iostream>
#include <map>
using namespace std;
class A
{
        private:
        int a;
        public:
        A(int _a):a(_a){}
        bool operator >(A s)
        {
                return (this->a>s.a);
        }
        void show()
        {
                cout<<"a="<<a<<endl;
        }
};
class B
{
        public:
        bool operator () (A a,A b)
        {
                return (a>b);
        }
};
void display(map<A,int,B> s)
{
        map<A,int,B>::iterator it;
        for(it=s.begin();it!=s.end();it++)
        {
                //(it->first).show();
        }
}

int main()
{
        map<A,int,B> c1;
        c1.insert(map<A,int,B>::value_type(A(1),1));
        c1.insert(pair<A,int>(A(2),2));
        display(c1);
        return 0;
}

请版主再帮忙看看
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-11 21:01:55 | 显示全部楼层
  1. #include <iostream>
  2. #include <map>
  3. using namespace std;
  4. class A
  5. {
  6.         private:
  7.         int a;
  8.         public:
  9.         A(int _a):a(_a){}
  10.         bool operator >(A s)
  11.         {
  12.                 return (this->a>s.a);
  13.         }
  14.         void show() const
  15.         {
  16.                 cout<<"a="<<a<<endl;
  17.         }
  18. };
  19. class B
  20. {
  21.         public:
  22.         bool operator () (A a,A b)
  23.         {
  24.                 return (a>b);
  25.         }
  26. };
  27. void display(map<A,int,B> s)
  28. {
  29.         map<A,int,B>::iterator it;
  30.         for(it=s.begin();it!=s.end();it++)
  31.         {
  32.                 (it->first).show();
  33.         }
  34. }

  35. int main()
  36. {
  37.         map<A,int,B> c1;
  38.         c1.insert(map<A,int,B>::value_type(A(1),1));
  39.         c1.insert(pair<A,int>(A(2),2));
  40.         display(c1);
  41.         return 0;
  42. }
复制代码
把void show()改为void show() const
因为map的键是不可改变的,所以it->first的类型是const A&,因此只能调用const成员函数

此外你自己看看,很多成员函数都可以写为const成员函数,你都没有写,这些函数都存在类似的隐患
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-11 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表