Re: Better way of allocating a memory( auto_ptr vs new vs malloc)
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.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34