Virus721
Virus721

Reputation: 8315

const issue with pointer to pointer

I have a function that i'm using to delete buffers. The pointers are passed by address so that the function can also unset them once the memory is released :

static void _FreeBuf( const uchar16_t ** pBufPtr );

void Ucs2String::_FreeBuf( const uchar16_t ** pBufPtr );
{
   assert( NULL != pBufPtr && NULL != *pBufPtr );

   delete[] *pBufPtr;
   *pBufPtr = NULL;
}

But when using it as follows :

_FreeBuf( & m_wsBuf );

Where m_wsBuf is a member : uchar16_t * m_wsBuf;

It generates an error :

Error   1   error C2664: 'core::Ucs2String::_FreeBuf' : cannot convert parameter 1 from 'uchar16_t **__w64 ' to 'const uchar16_t **'

Removing the const fixes the issue, but I don't understand why. The function is modifying the pointer passed by address, not the const uchar16_t array pointed to, so why do I need to remove this const ?

PS : I'm using VS2005 (and no C++11)

Upvotes: 0

Views: 88

Answers (1)

BlackDwarf
BlackDwarf

Reputation: 2070

The issue here is when you call the _FreeBuf( & m_wsBuf ); function: you try to convert a X** to a const X** (here X is uchar16_t, but the error would have occured no matter what the type is).

This is forbidden in C++ when this type of conversion is done implicitly (ie without const_cast).

You can fix this either by removing const, or by changing the parameter type to const uchar16_t * const* (which wouldn't work in this case since you could not set the pointer to NULL in your function).

For more info about the reason why C++ works that way, see this link.

Upvotes: 2

Related Questions