指向指针的const问题

时间:2015-05-13 09:18:54

标签: c++ c pointers const

我有一个用于删除缓冲区的函数。指针通过地址传递,以便在释放内存后函数也可以取消设置:

static void _FreeBuf( const uchar16_t ** pBufPtr );

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

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

但使用时如下:

_FreeBuf( & m_wsBuf );

m_wsBuf是会员的地方:uchar16_t * m_wsBuf;

它会产生错误:

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

删除const修复了问题,但我不明白为什么。 该函数正在修改地址传递的指针,而不是指向的const uchar16_t数组,为什么我需要删除这个const?

PS:我正在使用VS2005(而且没有C ++ 11)

1 个答案:

答案 0 :(得分:2)

此处的问题是,当您调用_FreeBuf( & m_wsBuf );函数时:您尝试将X**转换为const X**(此处X为uchar16_t,但错误会有无论什么类型都会发生。)

当隐式执行此类转换时(即没有const_cast),这在C ++中是禁止的。

您可以通过删除const或将参数类型更改为const uchar16_t * const*来解决此问题(在这种情况下,这不会起作用,因为您无法将指针设置为NULL功能)。

有关C ++以这种方式工作的原因的详细信息,请参阅this link