Re: Copy Constructor
On Jul 30, 3:54 pm, Erik Wikstr=F6m <Erik-wikst...@telia.com> wrote:
On 2007-07-30 12:21, Roy wrote:
On Jul 30, 2:52 pm, Roy <royash...@gmail.com> wrote:
On Jul 30, 1:18 pm, Dima Stopel <bravo...@gmail.com> wrote:
On Jul 30, 7: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 pointe=
r 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 pointin=
g to
the same address. Try printing the pointer value in your destruct=
or.
--
Ian Collins.
I that one of the problems is in the following function:
// Methods for name
char* getname()const{
cout<<"Address:Name>>"<<&name<<endl;
return name;
}
You print the pointer to pointer to name and not the actual value of
the pointer.
If you change this line: cout<<"Address:Name>>"<<&name<<endl;
to this line: cout<<"Address:Name>>"<<(void*)name<<endl;
you will get the following output:
Constructor called
Constructor called
Before Assignent
Object A
0012FF50
Address:Name>>00356328
Hitesh
Address:Num>>0012FF54
10
Object B
0012FF40
Address:Name>>00356370
Rajesh
Address:Num>>0012FF44
30
After Assignent
Object A
0012FF50
Address:Name>>00356370
Rajesh
Address:Num>>0012FF54
30
Object B
0012FF40
Address:Name>>00356370
Rajesh
Address:Num>>0012FF44
30
Press any key to continue . . .
Destructor called
Destructor called
After the copy operation the name addresses are the same. This is wh=
at
you have expected, not ?
Yes , your observation with the code is correct , Its a fault and
actually printing the pointer to a pointer .
and yes after the copy operation the name addresses are the
same :-) .
Thanks
Dima
continuing with the initialization list this code compiles okay and r=
uns fine but does it create a memory leak ?
class x{
public:
char* getname(){return b}
x():b(NULL){}
x(acName):b(acName){}
~x(){}
private:
char* b;
};
main(){
x *a;
a=new x("ashish");
cout<<a->getname()<<endl;
delete a;
}
Kindly point out the errors in this code ?
You probably want to store a copy of the name, not just a pointer to it.
Consider what would happen if someone changed the text pointed to by b.
--
Erik Wikstr=F6m
Hmmm , Ok , so what should be the right way of doing it through an
initialization list ? should i use the String type instead of a
char* ?
Regards ,
Ashish