uint8_t类型向量的内存地址

Memory address of vector of uint8_t

本文关键字:内存 地址 向量 类型 uint8      更新时间:2023-10-16

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

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地址?如果我仍然想避免动态分配内存,那么解决这个问题的最佳方法是什么?

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

返回const uint8_t*或使方法非const:

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

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

删除const将解决这个问题,因为将const添加到返回的指针。如果这个函数确实应该const,但返回一个非const指针,那么将vector标记为mutable可能是正确的;const_cast可能也是安全的,但在使用之前,您可能需要询问何时真正安全的细节。然而,大多数情况下,这样的问题出现,你的设计有问题,应该重新设计。