C++-内存分配中,关于allocator类

发布于 2017-01-19 16:13:21 字数 79 浏览 1372 评论 3

为什么在alloctor类中,有了deallocate()函数,还需要destroy()函数?能不能够不销毁分配的对象,直接将对象的内存释放掉?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

偏爱自由 2017-08-10 08:58:57

allocator把内存配置和对象构造的操作分开,分别由alloc::allocate()和::construct()负责,同样内存释放和对象析够操作也被分开分别由alloc::deallocate()和::destroy()负责。这样可以保证高效,因为对于内存分配释放和构造析够可以根据具体类型(type traits)进行优化。比如一些类型可以直接使用高效的memset来初始化或者忽略一些无痛无氧析够函数。对于内存分配alloc也提供了2级分配器来应对不同情况的内存分配。
关于“不销毁分配的对象,直接将对象的内存释放掉”这点,我估计你是没有弄清楚析构和内存释放的关系,内存释放只是析构的工作部分之一,析构函数的作用是做类清理工作,释放占用的资源(内存也是一种资源,对象方可能还会有占有别的资源,举例来说,Lock 类可能锁定了一个信号量,那么析构函数将释放该信号量。)。

归属感 2017-07-09 16:11:59

创建对象的步骤一定是:1.申请内存;2.构造对象。
销毁对象的步骤一定是:1.析构对象;2.释放内存。
这些步骤是一步都不能少也不能乱的。
就创建对象来说,第一步肯定是申请内存,然后会根据需要调用类中的某一个构造函数,进行构造对象,以及一些初始化工作。
就销毁对象来说,析构对象是必需的,因为在析构函数中可能需要做其他的一些必要的事情,比如成员指针指向的对象的释放,对象的一些收尾工作等,这一步是不能跳过的,虽然也有些时候析构函数什么都没做,最后才是释放内存。

瑾兮 2017-01-20 10:22:11

STL allocator将对象析构和释放内存区分开来。内存配置有alloc:allocate()负责,内存释放操作由alloc:deallocate()负责;对象构造操作由::constructor()负责,对象析构操作由::destroy()负责。

先销毁对象,再释放内存一步都不能少~否则会出现资源泄露~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文