算术std::unique_ptr和void*(通过地址获取元素的位置)



我有一个类:

  1. 分配blockSize*maxSize字节的内存。有一个返回ptr以释放内存块的方法
  2. 例如,我在main()中填充这个块(参见下面的用法(,并将其发送回我的类

问题:如何获取初始化数据的发送回地址的位置?因为在main((中,我有void* ptr,而不是std::unique_ptr,并且无法使用方法memoryPool.get()的算术。

class A {
private:
size_t maxBlocks;
size_t blockSize;
std::unique_ptr<unsigned char[]> memoryPool;
void *getObjPtr(const size_t pos) const {
return reinterpret_cast<void *>(memoryPool.get() + pos * blockSize);
}

public:
A(size_t blockSize, size_t maxBlocks) : blockSize(blockSize), maxBlocks(maxBlocks),
memoryPool(new unsigned char[maxBlocks * blockSize]) {}
void *getFree() {
for (size_t i = 0; i < maxBlocks; ++i) {
//check if this block not use (I cut this part)
return getObjPtr(i);
}
}
size_t getPosition(void *data) {
//how can I get position of element? 
// auto pos = ((char*)data - memoryPool.get()) / blockSize; - not works
// ok there should be C++ style reinterpret_cast, but to short code I skip it
}
}

用法示例:

int main() {
A queue(sizeof(int), 10);
int *a = static_cast<int *>(queue.getFree());
*a = 4;
auto pos = queue.getPosition(a);//want to get position
}

做这件事的正确方法是什么?主要不使用std::unique_ptr

当我使用Visual C++2019编译您的代码时,我会收到以下错误:

error C2440: '-': cannot convert from 'unsigned char *' to 'char *'

如果我根据错误消息将您的代码更改为强制转换为unsigned char*,那么它将编译:

auto pos = ((unsigned char*)data - memoryPool.get()) / blockSize;

这是否符合你的意图——嗯,看起来确实如此,但你还没有明确说明getPosition的作用,所以我只能猜测。

请在以后发布错误消息,而不仅仅是说它不起作用!它会帮助我们帮助你。

相关内容

  • 没有找到相关文章

最新更新