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()
的风格比 &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向量的内存地址的主要内容,如果未能解决你的问题,请参考以下文章