由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问一个 Andrei A. 的 Modern c++ design 书里边的一个问题
相关主题
关于内存泄漏c++环境入门问题
几个问题说起来上次谁推荐的memmove作面试题来着
如何在fortran中定义一个动态的数组?请教(C++)
怎样高效管理内存?Dynamic buffer management question
vector的析构问题C++中size_type怎么处理?
再请教两道QuantC++面试题哪位在Linux上用C++碰到过memory fragmentation吗?
现在iOS的内存管理是怎么样的?effective C++里的memory pool 一问:
问个很基础的问题why do we still use dynamic allocation?
相关话题的讨论汇总
话题: blocksize话题: deallocate话题: torelease话题: pdata
进入Programming版参与讨论
1 (共1页)
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, 但是这不是很重要
: , 所谓空即是色, 色即是空...
:

1 (共1页)
进入Programming版参与讨论
相关主题
why do we still use dynamic allocation?vector的析构问题
又问几个c语言编程的题目再请教两道QuantC++面试题
C++的exception大家常用吗?现在iOS的内存管理是怎么样的?
使用assert应遵循什么原则?问个很基础的问题
关于内存泄漏c++环境入门问题
几个问题说起来上次谁推荐的memmove作面试题来着
如何在fortran中定义一个动态的数组?请教(C++)
怎样高效管理内存?Dynamic buffer management question
相关话题的讨论汇总
话题: blocksize话题: deallocate话题: torelease话题: pdata