拷贝构造函数里面动态分配内存,析构函数释放问题!
问题出现在析构函数释放name的空间上,编译没问题,运行中断,希望高手解答!其中d1,d2,d3,s1,s2,s3,s4为测试计数而用,没用实际意义!#include<I...
问题出现在析构函数释放name的空间上,编译没问题,运行中断,希望高手解答!
其中d1,d2,d3,s1,s2,s3,s4为测试计数而用,没用实际意义!
#include <IOSTREAM.H>
#include <string.H>
class data
{
int year,month,day;
int d1,d2,d3;
public:
data()
{
static d1=0;
d1++;
cout<<"d1="<<d1<<endl;
}
data(int y,int m,int d):year(y),month(m),day(d)
{
static d2=0;
d2++;
cout<<"d2="<<d2<<endl;
}
data(data &d):year(d.year),month(d.month),day(d.day)
{
static d3=0;
d3++;
cout<<"d3="<<d3<<endl;
}
~data(){}
};
class stu
{
int id;
char *name;
data birth;
int s1,s2,s3,s4;
public:
stu()
{
static s1=0;
s1++;
cout<<"s1="<<s1<<endl;
}
stu(int i,char *n,int y,int m,int d)
{
static s2=0;
s2++;
cout<<"s2="<<s2<<endl;
this->name=n;
}
stu(int i,char *n,data b)
{
static s3=0;
s3++;
cout<<"s3="<<s3<<endl;
this->name=n;
}
stu(stu &s)
{
static s4=0;
s4++;
cout<<"s4="<<s4<<endl;
this->id=s.id;
this->name=new char[strlen(s.name)+1];
strcpy(this->name,s.name);
}
~stu()
{
if (name!=0)
{
delete []name;
}
}
};
void main()
{
data d1;
cout<<endl;
data d2(1990,9,12);
cout<<endl;
data d3(d1);
cout<<endl;
stu s1;
cout<<endl;
stu s2(120114,"Ning",1990,9,12);
cout<<endl;
stu s3(120114,"Ning",d1);
cout<<endl;
stu s4=s2;
} 展开
其中d1,d2,d3,s1,s2,s3,s4为测试计数而用,没用实际意义!
#include <IOSTREAM.H>
#include <string.H>
class data
{
int year,month,day;
int d1,d2,d3;
public:
data()
{
static d1=0;
d1++;
cout<<"d1="<<d1<<endl;
}
data(int y,int m,int d):year(y),month(m),day(d)
{
static d2=0;
d2++;
cout<<"d2="<<d2<<endl;
}
data(data &d):year(d.year),month(d.month),day(d.day)
{
static d3=0;
d3++;
cout<<"d3="<<d3<<endl;
}
~data(){}
};
class stu
{
int id;
char *name;
data birth;
int s1,s2,s3,s4;
public:
stu()
{
static s1=0;
s1++;
cout<<"s1="<<s1<<endl;
}
stu(int i,char *n,int y,int m,int d)
{
static s2=0;
s2++;
cout<<"s2="<<s2<<endl;
this->name=n;
}
stu(int i,char *n,data b)
{
static s3=0;
s3++;
cout<<"s3="<<s3<<endl;
this->name=n;
}
stu(stu &s)
{
static s4=0;
s4++;
cout<<"s4="<<s4<<endl;
this->id=s.id;
this->name=new char[strlen(s.name)+1];
strcpy(this->name,s.name);
}
~stu()
{
if (name!=0)
{
delete []name;
}
}
};
void main()
{
data d1;
cout<<endl;
data d2(1990,9,12);
cout<<endl;
data d3(d1);
cout<<endl;
stu s1;
cout<<endl;
stu s2(120114,"Ning",1990,9,12);
cout<<endl;
stu s3(120114,"Ning",d1);
cout<<endl;
stu s4=s2;
} 展开
展开全部
不new不delete,new一个就匹配一个delete。析构函数里要想delete,那么每个构造函数就相应的得new了。
#include <IOSTREAM.H>
#include <string.H>
class data
{
int year,month,day;
int d1,d2,d3;
public:
data()
{
static d1=0;
d1++;
cout<<"d1="<<d1<<endl;
}
data(int y,int m,int d):year(y),month(m),day(d)
{
static d2=0;
d2++;
cout<<"d2="<<d2<<endl;
}
data(data &d):year(d.year),month(d.month),day(d.day)
{
static d3=0;
d3++;
cout<<"d3="<<d3<<endl;
}
~data(){}
};
class stu
{
int id;
char *name;
data birth;
int s1,s2,s3,s4;
public:
stu()
{
static s1=0;
s1++;
cout<<"s1="<<s1<<endl;
this->name = new char[1];//
strcpy(this->name,"");
}
stu(int i,char *n,int y,int m,int d)
{
static s2=0;
s2++;
cout<<"s2="<<s2<<endl;
//this->name=n;
this->name=new char[5];//
strcpy(this->name,n);
}
stu(int i,char *n,data b)
{
static s3=0;
s3++;
cout<<"s3="<<s3<<endl;
this->name=new char[5];//
strcpy(this->name,n);
}
stu(stu &s)
{
static s4=0;
s4++;
cout<<"s4="<<s4<<endl;
this->id=s.id;
this->name=new char[strlen(s.name)+1];//
strcpy(this->name,s.name);
}
~stu()
{
if (name!=NULL)
{
delete []name;
}
}
};
void main()
{
data d1;
cout<<endl;
data d2(1990,9,12);
cout<<endl;
data d3(d1);
cout<<endl;
stu s1;
cout<<endl;
stu s2(120114,"Ning",1990,9,12);
cout<<endl;
stu s3(120114,"Ning",d1);
cout<<endl;
stu s4=s2;
}
#include <IOSTREAM.H>
#include <string.H>
class data
{
int year,month,day;
int d1,d2,d3;
public:
data()
{
static d1=0;
d1++;
cout<<"d1="<<d1<<endl;
}
data(int y,int m,int d):year(y),month(m),day(d)
{
static d2=0;
d2++;
cout<<"d2="<<d2<<endl;
}
data(data &d):year(d.year),month(d.month),day(d.day)
{
static d3=0;
d3++;
cout<<"d3="<<d3<<endl;
}
~data(){}
};
class stu
{
int id;
char *name;
data birth;
int s1,s2,s3,s4;
public:
stu()
{
static s1=0;
s1++;
cout<<"s1="<<s1<<endl;
this->name = new char[1];//
strcpy(this->name,"");
}
stu(int i,char *n,int y,int m,int d)
{
static s2=0;
s2++;
cout<<"s2="<<s2<<endl;
//this->name=n;
this->name=new char[5];//
strcpy(this->name,n);
}
stu(int i,char *n,data b)
{
static s3=0;
s3++;
cout<<"s3="<<s3<<endl;
this->name=new char[5];//
strcpy(this->name,n);
}
stu(stu &s)
{
static s4=0;
s4++;
cout<<"s4="<<s4<<endl;
this->id=s.id;
this->name=new char[strlen(s.name)+1];//
strcpy(this->name,s.name);
}
~stu()
{
if (name!=NULL)
{
delete []name;
}
}
};
void main()
{
data d1;
cout<<endl;
data d2(1990,9,12);
cout<<endl;
data d3(d1);
cout<<endl;
stu s1;
cout<<endl;
stu s2(120114,"Ning",1990,9,12);
cout<<endl;
stu s3(120114,"Ning",d1);
cout<<endl;
stu s4=s2;
}
更多追问追答
追问
多谢,运行没问题,可是每个构造函数都是深复制吧,可不可以delete指定释放特定的构造函数的new,或者部分构造函数深复制,部分浅复制?
追答
只有拷贝构造函数才存在深拷贝和浅拷贝的问题。就是一个对象中要拷贝一个副本,但是原来那个对象中有一个指针元素,拷贝过去的时候如果你自己在申请一个空间然后拷贝后的指针指向新申请的空间,那就是深拷贝了,像现在你写的拷贝构造函数就是深拷贝了。如果你不自己写拷贝构造函数,那么系统默认的那个拷贝构造函数是浅拷贝,也就是拷贝一个副本的时候副本里的那个指针元素指向的是原版对象的内存空间,也就是共用一份空间,这样的话两个对象析构的话,就会出现对同一份空间析构两次了,这时候就出错啦。
要理解清楚了,只有数据域带有指针元素的拷贝构造函数才考虑到深拷贝和浅拷贝。而其它的构造函数或者甚至不带指针元素的拷贝构造函数谈论深拷贝和浅拷贝都是没有意义的。
所以你的问题就显得有点不太专业了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
2011-06-09
展开全部
首先你有几个构造函数没有为name申请空间,字符串之间的赋值你用的=也不行,第3析构函数在什么时候调用你要清楚(对象的生命域结束才会调用析构函数),第4 name是一个地址值,取里面的内容要用*name,除非你析构函数想判断name是不是0地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、浅拷贝:默认的拷贝就是浅拷贝。 仅仅多了个指针指向原来的空间。
2、深拷贝:自己写的拷贝,自己申请了动态内存空间,用了new 或 malloc 。不但多了指针,而且多了空间。
3、用深拷贝的话,最好用自己写的析构,记得在里面释放内存,也可以用默认析构。
4.用浅拷贝(即默认隐藏的拷贝),最好用默认析构,若用自己写的析构里面 ,记得不要释放内存,不然会造成重复释放内存而报错。
2、深拷贝:自己写的拷贝,自己申请了动态内存空间,用了new 或 malloc 。不但多了指针,而且多了空间。
3、用深拷贝的话,最好用自己写的析构,记得在里面释放内存,也可以用默认析构。
4.用浅拷贝(即默认隐藏的拷贝),最好用默认析构,若用自己写的析构里面 ,记得不要释放内存,不然会造成重复释放内存而报错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询