有没有“指定位置删除”(placement delete)?


  
没有,不过如果你需要的话,可以自己写一个。 
  
看看这个指定位置创建(placement new),它将对象放进了一系列Arena中; 
  
       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 new”的内建的
“placement delete”,原因是,没有一种通用的方法可以保证它被正确地使用。在C++
的类型系统中,没有什么东西可以让我们确认,p1一定指向一个由 Arena类型的a1分派
的对象。p1可能指向任何东西分派的任何一块地方。 
  
然而,有时候程序员是知道的,所以这是一种方法: 
  
        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 维护了它保存着的对象的线索,你甚至可以自己写一个析构函数,以避免它发
生错误。 
  
这也是可能的:定义一对相互匹配的操作符 new()和 delete(),以维护《C++程序设计
语言》15.6中的类继承体系。参见《C++语言的设计和演变》10.4 和《C++程序设计语言》
19.4.5。 

posted on 2007-03-24 09:47 阿刚 阅读(409) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(1)

随笔档案

文章档案

C++ BBS

C++ FAQ

C++ WEBSITE

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜