指向指针的 const 问题

const issue with pointer to pointer

我有一个函数可以用来删除缓冲区。指针是按地址传递的,因此一旦释放内存,函数也可以取消设置它们:

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)

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

当这种类型的转换隐式完成时(即没有 const_cast),这在 C++ 中是被禁止的。

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

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