科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Bjarne:有没有“指定位置删除”?

Bjarne:有没有“指定位置删除”?

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

没有,不过如果你需要的话,可以自己写一个。

作者:Molly编译 来源:天极网 2007年10月27日

关键字: Bjarne 指定位置删除 Linux

  • 评论
  • 分享微博
  • 分享邮件
 没有,不过如果你需要的话,可以自己写一个。

  看看这个指定位置创建(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。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章