我有一个类:
- 分配blockSize*maxSize字节的内存。有一个返回ptr以释放内存块的方法
- 例如,我在
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
的作用,所以我只能猜测。
请在以后发布错误消息,而不仅仅是说它不起作用!它会帮助我们帮助你。