指针指针的 const 问题

Posted

技术标签:

【中文标题】指针指针的 const 问题【英文标题】:const issue with pointer to pointer 【发布时间】:2015-05-13 09:18:54 【问题描述】:

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

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)

【问题讨论】:

FWIW,在C 中,您不需要指向free() 的指针。 我在 C++ 中也不会。正如我所说,我通过地址传递指针,以便在释放内存后取消设置它们。 不相关,但不要使用前导下划线后跟大写字母those are reserved in all scopes的符号。 嗯,我知道双下划线,但不是我一直用于非公开事物的这个。很高兴知道。 【参考方案1】:

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

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

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

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

【讨论】:

感谢您的回答。我不明白为什么它被禁止。尝试将 const 转换为 non-const 会产生错误,这是有道理的,但从 non-const 转换为 const 不应该,这就是我在这里尝试这样做的原因。此外,如果我添加第二个 const,一旦我删除了它指向的内容,我将无法取消设置指针。编辑 ho 没有看到链接,我要读这个。 我在答案中提供的链接解释了为什么一些非常量到常量的转换会导致错误。关于添加第二个常量,你是对的,在你的情况下它不起作用,因为你不能将指针设置为 NULL,这只是这个问题的一般解决方法。我编辑了我的答案以使其更清晰。

以上是关于指针指针的 const 问题的主要内容,如果未能解决你的问题,请参考以下文章

指针指针的 const 问题

为啥我们不能定义一个指向 int 指针的低 + *** const 指针?

为指向 const 的指针赋值 指向 const char 的指针 (const char * const * p)

将“指向 const 的指针”转换为“指向 const VLA 的指针”

C 语言const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

指针常量和常量指针