F*********k 发帖数: 42 | 1 各位大牛。。
我在看Andrei Alexandrescu的那本 Modern c++ design 的书,有个问题不是很明白,
不知哪位大牛看过给我解答一下。。。
书的第四章 Small-Object Allocation 里边,他设计的程序是不是存在这样一个隐患?
如果次序是这样的话:
allocate obj _aa, _bb, _cc;
deallocate _cc;
deallocate _aa;
new allocation request; // 根据他的code他会使用last deallocate的location,
// 就是 _aa
another new allocation requrest; // 根据他的code,他会使用_aa的下一个 memory
// block,那不是_bb么?我_bb没有
// deallocate啊,这不是overwrite了么?
他给出了书里边的源程序使用的code:
http://sourceforge.net/projects/loki-lib/files/Source%20Code/
求解答是不是我哪里没看明白。。如果这个确实是问题,想问问大家具体应该怎么改正
啊?要用 linked list 么? 还是什么别的办法?
他给的那本书的sample code我也看了,没看出有什么能避免这个的。。。
谢谢大家了。。。
| t****t 发帖数: 6806 | 2 首先, 下次请直接贴代码. 你给的link是整本书的代码, 不是每个人都有耐心替你找的
, 也不是每个人都看过他的书. 贴完代码以后请指出是哪个class或哪一行的问题.
接下来针你的问题: 如果我没看错的话, 你问的问题是在FixedAllocator里面. 那么他
的设计是有一个链表的, 在FixedAllocator::Chunk::Reset()里初始化, chunk 0指向1
, 1指向2, 等等. 用的不是显式指针, 而是chunk的序列号, 转换成unsigned char. 所
以一个allocator最多管256个chunk. 最后的terminate依靠blocksAvailable_来保证.
知道这是个链表以后, 我想你应该能看懂这段程序了, 不会发生你说的问题, 因为每次
deallocate都把空chunk加到链表的开头. 严格的说这是一个stack, 但是这不是很重要
, 所谓空即是色, 色即是空...
患?
【在 F*********k 的大作中提到】 : 各位大牛。。 : 我在看Andrei Alexandrescu的那本 Modern c++ design 的书,有个问题不是很明白, : 不知哪位大牛看过给我解答一下。。。 : 书的第四章 Small-Object Allocation 里边,他设计的程序是不是存在这样一个隐患? : 如果次序是这样的话: : allocate obj _aa, _bb, _cc; : deallocate _cc; : deallocate _aa; : new allocation request; // 根据他的code他会使用last deallocate的location, : // 就是 _aa
| F*********k 发帖数: 42 | 3 好的,谢谢谢谢,我想我大概明白了,
我之前没看明白 FixedAllocator::Chunk::Deallocate 里边的
*toRelease = firstAvailableBlock_; 这句
其实这句实际上把当前和之前的连接起来了。
我把源码贴这里
void FixedAllocator::Chunk::Reset(std::size_t blockSize, unsigned char
blocks)
{
assert(blockSize > 0);
assert(blocks > 0);
// Overflow check
assert((blockSize * blocks) / blockSize == blocks);
firstAvailableBlock_ = 0;
blocksAvailable_ = blocks;
unsigned char i = 0;
unsigned char* p = pData_;
for (; i != blocks; p += blockSize)
{
*p = ++i;
}
}
void FixedAllocator::Chunk::Deallocate(void* p, std::size_t blockSize)
{
assert(p >= pData_);
unsigned char* toRelease = static_cast(p);
// Alignment check
assert((toRelease - pData_) % blockSize == 0);
*toRelease = firstAvailableBlock_;
firstAvailableBlock_ = static_cast(
(toRelease - pData_) / blockSize);
// Truncation check
assert(firstAvailableBlock_ == (toRelease - pData_) / blockSize);
++blocksAvailable_;
}
向1
【在 t****t 的大作中提到】 : 首先, 下次请直接贴代码. 你给的link是整本书的代码, 不是每个人都有耐心替你找的 : , 也不是每个人都看过他的书. 贴完代码以后请指出是哪个class或哪一行的问题. : 接下来针你的问题: 如果我没看错的话, 你问的问题是在FixedAllocator里面. 那么他 : 的设计是有一个链表的, 在FixedAllocator::Chunk::Reset()里初始化, chunk 0指向1 : , 1指向2, 等等. 用的不是显式指针, 而是chunk的序列号, 转换成unsigned char. 所 : 以一个allocator最多管256个chunk. 最后的terminate依靠blocksAvailable_来保证. : 知道这是个链表以后, 我想你应该能看懂这段程序了, 不会发生你说的问题, 因为每次 : deallocate都把空chunk加到链表的开头. 严格的说这是一个stack, 但是这不是很重要 : , 所谓空即是色, 色即是空... :
|
|