Can you mix free and constructor in C++? [duplicate]
Possible Duplicate:
Is there any danger in calling free() or delete instead of delete[]?
I was reading this question:
开发者_JAVA技巧 In what cases do I use malloc vs new?Someone raised that one reason to use malloc was if you were going to use free.
I was wondering: Is it valid to mix a free call and a constructor initialization in C++?
i.e.
Can I say:
my_type *ptr = new my_type;
free(my_type);
Is that somehow invalid or worse than:
my_type *ptr = new my_type;
delete my_type;
other than the fact that it's not c++ish?
Likewise, could you do the opposite? Can you say
my_type *ptr = (my_type *)malloc(sizeof(my_type));
delete my_type;
Please merge if this is a duplicate, I searched but didn't see a question along this lines exactly about malloc/delete/new/free asked.
No it is invalid. There is no guarantee that new
will use malloc
or delete
will use free
.
Moreover, using free
instead of delete
will skip my_type
's destructor. If my_type
itself is holding some resources, those will be leaked. Similarly, malloc
will skip the constructor so the variable may be in an invalid state.
Is it valid to mix a free call and a constructor initialization in C++?
No it is not.
malloc,calloc,realloc -> free
new -> delete
new[] -> delete[]
No, this is not valid. malloc
(and other C allocation functions) must be matched with free
, new
must be matched with delete
, and new []
must be matched with delete []
. While your compiler may not necessarily do anything differently if there is no destructor code, this is not something you should rely on.
The main difference is that new/delete call the constructor and destructor of an object; malloc and free just treat it as raw, untyped memory.
free()
does not call the destructor. It just deallocates the memory, no questions asked.new
/delete
is not guaranteed to usemalloc()
as its memory allocator;free
might not even know about the memory you're throwing at it
精彩评论