如何解决算术 std::unique_ptr 和 void* 按地址获取元素的位置
我有一堂课:
- 分配 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
}
正确的做法是什么?在 main 中不使用 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
的作用,所以我只能猜测。
请以后把错误信息贴出来,不要光说不行!它会帮助我们帮助您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。