Re: Better way of allocating a memory( auto_ptr vs new vs malloc)
On Dec 7, 2:48 pm, James Kanze <james.ka...@gmail.com> wrote:
On Dec 7, 10:34 am, Erik Wikstr=F6m <Erik-wikst...@telia.com> wrote:
On 2008-12-06 23:36, blargg wrote:
Ami wrote:
My god that is so hard to read. Look at the difference a
couple of find-and-replaces and some indention do:
And it lets us find some things to improve upon.
I have few qustions
Consider the allocation
T p(T());
T p(); will do just as well.
Not at local scope (which IIRC was the case). At local scope,
that declares a function.
T() in above would do default initialization right
then I can safely avoid the use of C style memset..
and then nevere have to de allocate the same.
As far as auto_ptr is concrned , do I again need to
initialize to T () as shown below
auto_ptr<T>p = (new T()) ;
No need to use () around the new, auto_ptr<T>p = new T();
works just as fine.
It shouldn't. At least according to C++98. (I don't have a
copy of the C++03 standard here.) There's no assignment
operator of auto_ptr which takes a T*, and there's no implicit
conversion.
another major concerned abt using auto_ptr is
after the memory allocation is done tht is lets say
int main ()
{
auto_ptr<T>p = (new T()) ;
func(p.get()); //
return ( EXIT_SUCESS);
}
void func(T *output)
{
// some code
}
do u see any problem with uisng an auto pointer like above
i.e passing as an argument in a function call .
No problem at all, but you might want to consider using a
shared pointer and pass that instead of using get(). Or pass a
reference to the auto ptr.
Or pass a reference to the object, using *p in the calling
function. (Unless the called function is capable of handling a
null pointer, this is the preferred solution.)
Is there any memory Leak ?
No, but there is always the risk that func() will somehow save
the pointer you pass in and someone else will later try to
access it.
I think the auto of auto ptr is the best way ..
Also in the code the malloc is done like
T *p = (T *)malloc (sizeof(T)*(n+1));
I'm not sure how it is in C++, but in C you do not have to
cast the result of malloc.
In C++, you do.
so using new for above is like
T *p = (T *)new char [sizeof(T)*(n+1)];
T* p = new T[n+1];
Just a reminder, too. You can't use std::auto_ptr with array
new. In C++, the preferred solution for this would be:
std::vector< char > obj( sizeof(T)*(n+1) ) ;
(Except that I suspect that what he wants is:
std::vector< T > obj( n + 1 ) ;
.)
--
James Kanze (GABI Software) email:james.ka...@gma=
il.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Dat=
enverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34- =
Hide quoted text -
- Show quoted text -
Thanks James and Eric for the explanation.. I have few questions
Eric you mention about passing a reference to the auto ptr for example
in the sample code , I have got now
int main ()
{
auto_ptr<T>p = (new T()) ;
func(&(p.get())); // Im passing a reference to the auto _ptr
p.release(); // Would free up
return ( EXIT_SUCESS);
}
void func(T *output)
{
output->do_Something();
}
Now if there is any exception gets thrown in the func()
what would be the behaviour of auto _ptr ??
Also in a function call please correct me if I am wrong
I can use * as func(*(p.get()));
correct ?
James .. My another question is
for allocating a memory to an array of structures
You mentioned about using vector like below
int main ()
{
std::vector< T > obj( n + 1 ) ;
func(obj);
return(EXIT_SUCCESS);
}
void func(&obj)
{
obj->do_Something();
}
if any exception is thrown in func() .. what will the end result ?
Many Thanks for your time