uint8_t向量的内存地址

Posted

技术标签:

【中文标题】uint8_t向量的内存地址【英文标题】:Memory address of vector of uint8_t 【发布时间】:2015-09-13 09:09:22 【问题描述】:

我在一个类中有以下数据:

std::vector<uint8_t> mData;

我使用的一个库函数(来自 SDL)要求像素缓冲区地址为 void*。我尝试编写以下类成员函数:

uint8_t* GetBuffer() const  return &mData[0]; 

但我得到了错误:

error: invalid conversion from 'const value_type* aka const unsigned char*' to 'uint8_t* aka unsigned char*' [-fpermissive]

我很困惑为什么我会收到这个错误(向量内存是在一个类中分配的),为什么它试图返回一个 const 地址?如果我仍然想避免动态分配内存,最好的解决方法是什么?

【问题讨论】:

旁白:mData.data() 的风格比 &amp;mData[0] 更好。 我之前尝试过 mData.data(),但遇到了同样的问题。 @Jary316 当然可以,因为基本一样。但它是更好的风格 【参考方案1】:

const 方法的 this 指针是 const,因此是它的成员。 mData 因此是 const

要么返回const uint8_t*,要么使方法成为非const:

uint8_t* GetBuffer()  return &mData[0]; 
const uint8_t* GetBuffer() const  return &mData[0]; 

【讨论】:

谢谢,我明白了!我完全错过了那个重要的细节,谢谢! @Jary316 如果我的回答解决了您的问题,请考虑通过单击旁边的绿色复选标记将其标记为已接受 :)【参考方案2】:

你的函数被标记为const,所以返回一个常量地址是唯一有意义的事情。

删除const 将解决此问题,就像将const 添加到返回的指针一样。如果这个函数真的应该const但返回一个非常量指针,那么将向量标记为mutable可能是正确的; const_cast 也可能是安全的,但您可能想在使用它之前询问何时真正安全的详细信息。然而,大多数时候出现这样的问题,您的设计存在问题,应该对其进行一些修改。

【讨论】:

谢谢!我现在明白我的错误了。

以上是关于uint8_t向量的内存地址的主要内容,如果未能解决你的问题,请参考以下文章

从向量中按内存地址删除共享指针

C语言——指针

C语言——指针

什么是中断向量

给定一个 int 偏移向量,如何使用 AVX512 内在函数收集单个字节?

在向量 GENy 中配置闪存块表