void* block = ::operator new(n*size);
int i;
for(i = 0;i<BLOCK_SIZE -1;i++){
*(unsigned int*)((unsigned int)block + n*i) = (unsigned int)block + n*(1+i);
}
*(unsigned int*)((unsigned int)block + n*i) = 0;
问题&GT;我无法理解上面代码的含义。似乎一块内存指向下一个块内存。
有人可以向我解释一下吗?
答案 0 :(得分:0)
block[0] = &block[1]
block[1] = &block[2]
block[2] = &block[3]
.
.
.
block[n] = 0 // dereferenced so not NULL, assigned zero as a value
AFAIS,它从头到尾指向下一个元素。尽管上面的演示看起来很简单,但它仍然是代码背后的逻辑。
答案 1 :(得分:0)
你已经非常正确了 - 它正在分配一块内存,然后将其视为多个节点,并将它们链接在一起作为链表。
现在看来,它看起来毫无意义,因为它没有分配任何内存来保存数据以及节点之间的链接(好吧,也许它确实如此 - 也许n
实际上大于sizeof(unsigned *)
和size
大于BLOCK_SIZE
,因此可以容纳更大的项目。
如果我要做这样的事情,我可能会编写更像这样的代码:
unsigned *block = (unsigned *)::operator new(n*size);
for (size_t i=0; i<size-2; i++)
block[i] = &block[i+1];
block[size-1] = nullptr;
当然,没有理由这样做,这也是值得怀疑的 - 大多数代码都可能是这样的:
std::vector<unsigned *> block(size);
for (int i=0; i<size-2; i++)
block[i] = &block[i+1];
block[size-1] = 0;