回 帖 发 新 帖 刷新版面

主题:[讨论]关于析构函数中的delete

// 关于建立构造函数完成部分成员的赋值
#include <iostream>
using namespace std;
#include "string"
class Score
{   char *Class;
    char *Name;
    float Math;
    public:
     Score(char *a,char *b,float c)
    {    Class=new char[strlen(a)+1]; //在为这个私有变量开辟空间,然后开始进行复制的操作,的,不要忘了,这个指针的不同
         Name=new char[strlen(b)+1];
         Math=c;
                  Math=c; // 这个形式形式也是可以的,就是用直接相通类型之间的赋值
       Class=a;
       Name=b;
      }
 Score()
     {}; 
    Score(Score &p) //当申明为一个引用的时候了,那么这个用me=Score(p)来得到这个p的值的复制值
     {  
        Class=p.Class;
          cout<<"了Score(score &p)构造函数\n"<<Class;
      
     }
  void Pri()
   { cout<<"*班级**" <<Class<<"**姓名**"<<Name<<" **这个是数学成绩**"<<Math<<endl;//这个里没有加上string头文件,而导致的错误的,提示,我晕死,,,
   }
  void CopyScore(Score &p)
   { *this=p;
   }
 ~Score()
 { // if(Class) delete[] Class; // 因为这个析构函数是在很多的地方引用的所以这个此时不能用
     //if(Name)  delete[] Name;
      
     cout<<"\n 调用了析构函数\n";
 }
 void DEL(void)
 {
          
};

void main()
{
    Score M("二班","刘焕庭",78),M1; //如果去掉前面的空构造函数的话,会提示没有相应的函数与他对应
     M.Pri();
      cout<<"取部分成员"<<endl;
     // M1.Score(M);
     M1=Score(M);//                                                                                                                                
     Score M2;
     // 注意此时调用了析构函数,于是会引起debug错误,所以说是错误的,这个析构函数不能完成,
     // 所以我手动建立一个删除函数,然后完成对这个new开辟的空间的删除
     cout<<"\n 开始进行复制了\n";
     M2.CopyScore(M);
     M2.Pri(); 
}

   我想问的就是,因为我开始使用这个new开辟的空间,那么我想在析构函数中调用这个delete,但是因为这个析构函数,在程序的执行的不同的段的时候都会引用,所以,会导致,错误,所以,我想问的就是,如果我建立了一个DEl()函数,就是专门用来删除new开辟的空间的,那么这个析构函数的作用是什么那,????       

回复列表 (共3个回复)

沙发

Score(Score &p) //当申明为一个引用的时候了,那么这个用me=Score(p)来得到这个p的值的复制值
     {  
        Class=p.Class;
          cout<<"了Score(score &p)构造函数\n"<<Class;
      
     }
注意你有形如这样的赋值,所以你最后的析构的时候可能遇到了不是由new分配而来的空间。如果你的class和name都是用strcpy来赋值就不会出现不能delete的情况了

板凳

我明白了,注意是因为这个指针的悬挂问题导致的,奥,我晕,调用或者自己建立的一个new开辟的空间,只是单纯的首地址进行了复制,而这个空间是公用的,当删除了一个指针的空间后,那个指针就是悬挂了,指向了一个已经删除了的空间了,所以此时如果还用delete删除第二个,会导致错误的,,,,,,,由于字符指针,所以不能用*A=*b的形式,否则是一个吧首字符传递了过去,据因该用strcpy全部拷贝过去的,

#include <iostream>
using namespace std;
#include "string"
class Score
{   char *Class;
    char *Name;
    float Math;
    public:
     
     Score(char *a,char *b,float c)
    {       Class=new char[strlen(a)+1];  
         Name=new char[strlen(b)+1];
         Math=c;
      Class=a;  //老是出现debug错误的原因竟然是这个导致的,不能直接赋值,这个样子的话,a的空间没有消失,所以会导致错误的???
      Name=b;
     // strcpy(Class,a);
   //   strcpy(Name,b);
       
      }
 Score()
     {}; 
    Score(Score &p);
  void Pri()
   { cout<<"*班级**" <<Class<<"**姓名**"<<Name<<" **这个是数学成绩**"<<Math<<endl;//这个里没有加上string头文件,而导致的错误的,提示,我晕死,,,
   }
  void CopyScore(Score &p)
   { *this=p;
   }
 ~Score()
 {   if(Class) delete[] Class; // 因为这个析构函数是在很多的地方引用的所以这个此时不能用
      if(Name)  delete[] Name;
      
     cout<<"\n 调用了析构函数\n";
 }
};
Score::Score(Score &p)
{  if(p.Class)  
    { Class=new char[strlen(p.Class)+1];
    strcpy(Class,p.Class);    // 个这个私有开辟空间,用来存放
    }
    if(p.Name)
{    Name=new char[strlen(p.Name)+1];
     //strcpy(Class,p.Name);原来这个是错误的,所以会导致指针悬挂问题
   strcpy(Name,p.Name);
}
    Math=p.Math;
  

}     
void main()
{
    Score M("二班","刘焕庭",78); //如果去掉前面的空构造函数的话,会提示没有相应的函数与他对应
    // M.Pri();
    //  cout<<"取部分成员"<<endl;
     // M1.Score(M);
     Score M1(M);     // 不是M1=M(M &p)                                                                                                                        
    M1.Pri();
   // cout<<"\n下面是一个复制的信息的"<<endl;
    M.Pri(); //开始是M与上面那个相同了,所以会导致错误
}
 //上面的程序仍然有指针悬挂问题,我说的是在不用strcpy之前

3 楼

呵呵,你的语言描述比较混乱,但是意思已经差不多对了

我来回复

您尚未登录,请登录后再回复。点此登录或注册