Re: Copy Constructor
On Jul 30, 9:24 am, Ian Collins <ian-n...@hotmail.com> wrote:
Roy wrote:
On Jul 30, 9:00 am, Ian Collins <ian-n...@hotmail.com> wrote:
royash...@gmail.com wrote:
// Destructor
~cpchk(){
cout<<"Destructor called"<<endl;
if(name!=0)
free(name);
}
a=b;
Heres the code i am talking about , Kindly comment .
Two serious errors:
You attempt to free name twice (why the check for 0?), whether or not it
was allocated by malloc.
--
Ian Collins.
Hi Ian ,
I have checked for 0 , as in the constructor i equate the pointer to
0 , that way my program knows how to check
against freeing a pointer not allocated memory .
Freeing NULL is a no-op, so you don't have to check.
In your case, you have no way of telling whether the name points to
dynamic memory.
I didn't get your point of freeing name twice . There are two
different Objects in the program . Both need to
have their memory freed ?
Once you assign one to the other, both have a name pointer pointing to
the same address. Try printing the pointer value in your destructor.
--
Ian Collins.
Constructor called
Before Assignent
Object A 0012FF6C
Address:Name>>0012FF6C
Address:Num>>0012FF70
Object B 0012FF64
Address:Name>>0012FF64
Address:Num>>0012FF68
After Assignent
Object A 0012FF6C
Address:Name>>0012FF6C
Address:Num>>0012FF70
Object B 0012FF64
Address:Name>>0012FF64
Address:Num>>0012FF68
Address:Object>>0012FF64
Destructor called
Address:Name>>0012FF64
Address:Num>>0012FF68
Address:Object>>0012FF6C
Destructor called
Address:Name>>0012FF6C
Address:Num>>0012FF70
heres what i get :-(
I have understood The NULL thing , i have modified the code to
#include<iostream>
using namespace std;
class cpchk{
private:
char* name;
int num;
public:
// Methods for name
char* getname()const{
cout<<"Address:Name>>"<<&name<<endl;
return name;
}
void setname(const char* acname){
if(name==NULL)
name=(char*)malloc((strlen(acname)+1)*sizeof(char));
else{
free(name);
name=NULL;
name=(char*)malloc((strlen(acname)+1)*sizeof(char));
}
strcpy(name,acname);
}
// Methods for num
int getnum()const{
cout<<"Address:Num>>"<<&num<<endl;
return num;
}
void setnum(const int inum){
num=inum;
}
// Constructors
cpchk(){
cout<<"Constructor called"<<endl;
name=NULL;
num=0;
}
cpchk(char* acname,int inum){
name=(char*)malloc((strlen(acname)+1)*sizeof(char));
strcpy(name,acname);
}
// Destructor
~cpchk(){
cout<<"Address:Object>>"<<this<<endl;
cout<<"Destructor called"<<endl;
cout<<"Address:Name>>"<<&name<<endl;
cout<<"Address:Num>>"<<&num<<endl;
if(name!=NULL)
free(name);
name=NULL;
}
};
int main(int argc,char** argv){
cpchk a,b;
a.setname("Hitesh");
a.setnum(10);
b.setname("Rajesh");
b.setnum(30);
cout<<endl<<"Before Assignent"<<endl;
cout<<"Object A"<<endl;
cout<<&a<<endl;
cout<<a.getname()<<endl;
cout<<a.getnum()<<endl;
cout<<"Object B"<<endl;
cout<<&b<<endl;
cout<<b.getname()<<endl;
cout<<b.getnum()<<endl;
a=b;
cout<<endl<<"After Assignent"<<endl;
cout<<"Object A"<<endl;
cout<<&a<<endl;
cout<<a.getname()<<endl;
cout<<a.getnum()<<endl;
cout<<"Object B"<<endl;
cout<<&b<<endl;
cout<<b.getname()<<endl;
cout<<b.getnum()<<endl;
return 0;
}