C++-内存分配中,关于allocator类
为什么在alloctor类中,有了deallocate()函数,还需要destroy()函数?能不能够不销毁分配的对象,直接将对象的内存释放掉?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
为什么在alloctor类中,有了deallocate()函数,还需要destroy()函数?能不能够不销毁分配的对象,直接将对象的内存释放掉?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
allocator把内存配置和对象构造的操作分开,分别由alloc::allocate()和::construct()负责,同样内存释放和对象析够操作也被分开分别由alloc::deallocate()和::destroy()负责。这样可以保证高效,因为对于内存分配释放和构造析够可以根据具体类型(type traits)进行优化。比如一些类型可以直接使用高效的memset来初始化或者忽略一些无痛无氧析够函数。对于内存分配alloc也提供了2级分配器来应对不同情况的内存分配。
关于“不销毁分配的对象,直接将对象的内存释放掉”这点,我估计你是没有弄清楚析构和内存释放的关系,内存释放只是析构的工作部分之一,析构函数的作用是做类清理工作,释放占用的资源(内存也是一种资源,对象方可能还会有占有别的资源,举例来说,Lock 类可能锁定了一个信号量,那么析构函数将释放该信号量。)。
创建对象的步骤一定是:1.申请内存;2.构造对象。
销毁对象的步骤一定是:1.析构对象;2.释放内存。
这些步骤是一步都不能少也不能乱的。
就创建对象来说,第一步肯定是申请内存,然后会根据需要调用类中的某一个构造函数,进行构造对象,以及一些初始化工作。
就销毁对象来说,析构对象是必需的,因为在析构函数中可能需要做其他的一些必要的事情,比如成员指针指向的对象的释放,对象的一些收尾工作等,这一步是不能跳过的,虽然也有些时候析构函数什么都没做,最后才是释放内存。
STL allocator将对象析构和释放内存区分开来。内存配置有alloc:allocate()负责,内存释放操作由alloc:deallocate()负责;对象构造操作由::constructor()负责,对象析构操作由::destroy()负责。
先销毁对象,再释放内存一步都不能少~否则会出现资源泄露~