懂c++同志请进。。。

panwai 2005-04-25 11:09:40
c++ primer p628页的一个程序如下:

class Screen {
public:
void *operator new( size_t );
void operator delete( void *, size_t );
// ...
private:
Screen *next;
static Screen *freeStore;
static const int screenChunk;
};



#include "Screen.h"
#include <cstddef>

// static members are initialized within
// program text files, not header files
Screen *Screen::freeStore = 0;
const int Screen::screenChunk = 24;

void *Screen::operator new( size_t size )
{
Screen *p;

if ( !freeStore ) {
// linked list empty: grab a chunk
// this call is to the global new
size_t chunk = screenChunk * size;
freeStore = p =
reinterpret_cast< Screen* >( new char[ chunk ] );
// now thread the memory allocated
for ( ;
p != &freeStore[ screenChunk - 1 ];
++p )
p->next = p+1;
p->next = 0;
}

p = freeStore; //这两条的意思我有些不太明白,
freeStore = freeStore->next; //哪位同志帮忙注释一下

return p;
}

Here is a possible implementation for the Screen member operator delete():

void Screen::operator delete( void *p, size_t )
{
// insert the "deleted" object back
// into the free list

( static_cast< Screen* >( p ) )->next = freeStore;//还有这个函数要表达的意图
freeStore = static_cast< Screen* >( p ); //也不太清楚,疑惑中!!
}

...全文
356 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhousqy 2005-04-26
  • 打赏
  • 举报
回复
學習。
凌雯 2005-04-26
  • 打赏
  • 举报
回复
我懂C++,所以进来,但问题已解决
bing_huo 2005-04-26
  • 打赏
  • 举报
回复
我懂C++,所以进来,但问题已解决。


那就混分~~
  • 打赏
  • 举报
回复
我懂C++,所以进来,但问题已解决。
useresu 2005-04-26
  • 打赏
  • 举报
回复
楼上qhfu(崩溃)说的很清楚了,呵呵.
强人那,学习
qhfu 2005-04-26
  • 打赏
  • 举报
回复
new char[ chunk ];这个分配的一段连续的存储区啊,
因为它分配的一段char[],reinterpret_cast< Screen* >这条语句把它解释为作为
Screen对象的存储区,所以后面能用p++ ;
p原来就是指向这段存储区的第一个地址。
panwai 2005-04-26
  • 打赏
  • 举报
回复
其实在这个地方我还有些似懂非懂,


size_t chunk = screenChunk * size;
freeStore = p =
reinterpret_cast< Screen* >( new char[ chunk ] ); //这里用全局new分配的空间
// now thread the memory allocated //应该不是连续的单元吧,那怎么
for ( ; // 能够用++p进行跌代呢?
p != &freeStore[ screenChunk - 1 ];
++p )
p->next = p+1; //还有这里的一条是为了将这些
p->next = 0; //空闲空间重新连成一个链,是吗?
哈哈,还得麻烦大家一下,问题解决再加分
qifa 2005-04-26
  • 打赏
  • 举报
回复
学习ing
qhfu 2005-04-26
  • 打赏
  • 举报
回复
查不多就这个意思,这样释放还给分配存储区的内存,,下次调用new分配给另一个对象时就可以再用了 ,,
panwai 2005-04-26
  • 打赏
  • 举报
回复
哦,原来如此,我真笨。。。
就是将回收的p所指的screen类的单元作为新的空闲存储区链的链头,然后再将静态指针freestore指向新链的链头,这样就刷新了原先freestore的记录值,对吧
zzxenjoy 2005-04-26
  • 打赏
  • 举报
回复
学习
学习!!!
开发经理 2005-04-26
  • 打赏
  • 举报
回复
还是好好努力吧!!!
dudu妈 2005-04-26
  • 打赏
  • 举报
回复
我懂C++,所以进来,但问题已解决
那我就混分阿
哈哈
thrillcattle 2005-04-26
  • 打赏
  • 举报
回复
借人气问问:谁看看我的问题啊?就在楼主的下面不远。
guofu_x 2005-04-26
  • 打赏
  • 举报
回复
楼上qhfu(崩溃),跟我想的一样,但是他解释得更好一点,呵呵~~~
mango279 2005-04-26
  • 打赏
  • 举报
回复
不喜欢在论坛里看代码,累
yuanyou 2005-04-26
  • 打赏
  • 举报
回复
呵呵!顶
whiteseal 2005-04-26
  • 打赏
  • 举报
回复
帮顶!
qhfu 2005-04-25
  • 打赏
  • 举报
回复
( static_cast< Screen* >( p ) )->next = freeStore;//就是把释放的内存又放入分配的存储区链中,因为这个p指针在使用的时候可能被转型为其它的类型,例如是 Screen的子类 。。 所以用static_cast<>把它强行转为Screen *
freeStore = static_cast< Screen* >( p ); //这句就是把freeStore 重新调到链头上去(或者说链尾看你怎么看)
qhfu 2005-04-25
  • 打赏
  • 举报
回复
p = freeStore; //就是把抓取的存储区的第一块内存分配出去
freeStore = freeStore->next; //然后把它的头指针指向后面一块,这就像一个链

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧