荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]有"placement delete"吗?
发信站: 荔园晨风BBS站 (Thu Jun 10 13:37:08 2004), 站内信件


Q: 有"placement delete"吗?
A: 没有。不过如果你真的想要,你就说嘛——哦不,我的意思是——你可以自己
写一个。

我们来看看将对象放至某个指定场所的placement new:

class Arena { public: void* allocate(size_t); void deallocate(void*);
// ... };
void* operator new(size_t sz, Arena& a) { return a.allocate(sz); }
Arena a1(some arguments); Arena a2(some arguments);

现在我们可以写:
X* p1 = new(a1) X;
Y* p2 = new(a1) Y;
Z* p3 = new(a2) Z;
// ...
但之后我们如何正确删除这些对象?没有内置“placement delete”的理由是,没
办法提供一个通用的placement delete。C++的类型系统没办法让我们推断出p1是
指向被放置在a1中的对象。即使我们能够非常天才地推知这点,一个简单的指针赋
值操作也会让我们重陷茫然。不过,程序员本人应该知道在他自己的程序中什么指
向什么,所以可以有解决方案:
template<class T> void destroy(T* p, Arena& a)
{
if (p) {
p->~T(); // explicit destructor call
a.deallocate(p);
}
}


这样我们就可以写:

destroy(p1,a1);
destroy(p2,a2);
destroy(p3,a3);


如果Arena自身跟踪放置其中的对象,那么你可以安全地写出destroy()函数 ,把
“保证无错”的监控任务交给Arena,而不是自己承担。
如何在类继承体系中定义配对的operator new() 和 operator delete() 可以参看
 《The C++ Programming Language》,Special Edition,15.6节 ,《The
Design and Evolution of C++》,10.4节,以及《The C++ Programming
Language》,Special Edition,19.4.5节。[译注:此处按原文照译。前面有提到
“参见《The C++ Programming Language》第三版”的,实际上特别版(
Special Edition)和较近重印的第三版没什么区别。]




--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店