Re: What's wrong with this snippet?
guojing1982423@yahoo.com.cn wrote:
Hi, any body can tell me what's wrong with following code?
class ABC
{
char *p;
public:
ABC()
{
p = (char*)malloc(50);
}
~ABC()
{
free(p);
}
};
void main()
{
ABC *pabc = new ABC;
ABC abc;
delete pabc;
}
I'll try to be short & sweet:
- ABC is a bad choice of name, but I'll accept its just as example. The
fact that you've used capitals is concerning, though, as this is
typically reserved for macros.
- Rather use vector<char> instead of char*, then you won't need to
override the copy-constructor and assignment operator.
- Classes that dynamically allocate memory and store a pointer to that
memory typically need to override the copy-constructor/assignment
operator, or prohibit copying/assigning by hiding it.
- If you do need to use an array, why use the heap. If you do need to
use the heap (for very large buffers, I suppose), it is more within the
flavour of C++ to use the operator new[] and its corresponding delete.
Also, in this case it would be impossible to write a proper copy
constructor due to the fact that the size of the dynamically allocated
array is not stored (Also the case for your malloc, BTW).
- The definition of main is non-standard, typically:
int main() or int main( int argc, char* argv[] )...
- In main, try and use RAII, as you have the possibility of a memory
leak if the second construction of ABC fails. In this case it would not
fail, but it would/could if it threw exceptions.
Typically I would rewrite it like this (I have not tested or compiled
this):
#include "Abc.h"
#include <memory>
#include <iostream>
#include <stdexcept>
int main()
{
try
{
std::auto_ptr<Abc> pabc( new Abc );
Abc abc;
}
catch( const std::exception& ex )
{
std::cerr << ex.what() <<std::endl ;
return -1;
}
catch( const std::exception& ex )
{
std::cerr << "Unknown exception thrown from main" <<std::endl ;
return -1;
}
return 0;
}
Is there
memory leak occured?
Not yet. But strange behaviour is lurking close by.
Kind regards,
Werner
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]