STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
2024-09-29 07:21:14
这里非常的绕口 需要仔细的来看看:
destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备
deallocate():真正的释放一个内存块。这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块。
看一个例子 应该就明白了真正的含义了:
#include <iostream> #include <stdlib.h> #include <unistd.h> using namespace std; class A { public: A() { data=new char[]; } ~A() { //free the data memory delete []data; } private: char *data; }; int main(int argc,char* argv[]) { for(;;) { A *a=new A; std::allocator<A> allocat; allocat.deallocate(a,sizeof(A)); } return ; }
明显 这样的做法会出问题,运行到一定的时间内会抛出异常。所以deallocate只是释放对象内存,并没有调用对象的构造函数释放对象内的动态内存 这点要注意 如果调用了一个 allocat.destory(a); 程序就不会有bug了
所以在C++中, 对象释放和对象内动态内存释放是需要注意的 弄不好 就会出现内存泄露现象。
这里的delete操作符号本身带有2个动作:调用析构函数 2释放内存。而::operator delete就只有释放内存。 deallocate函数就是基于operator delete函数封装的。 这点需要记住
可以通过看STL源码发现 :像vector()的析构函数都是有2个操作: destory() 释放对象内的动态内存(如果有) deallocate是释放对象本身占有的内存 通过这2点 就能保证内存不能泄露了
最新文章
- ps中的位图,矢量图,颜色模式
- ubuntu linux mysql 安装 基本操作 命令
- I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题
- 【C#进阶系列】18 特性Attribute
- string.Format格式化
- Activity 和 生命周期: 创建
- 随笔—邀请赛前训—	Codeforces Round #330 (Div. 2) B题
- 使用selenium来完成的例子
- RTLviewer与TechnologyMapViewer的区别?
- phpstorm使用svn爆出“cannot load supported formats” 的解决
- python 利用pop3接收邮件并保存附件
- [转] Android LocalService与RemoteService理解
- 如何下载coursera视频
- Android系统移植与驱动开发----第一章
- Android adb不是内部或外部命令 (转)
- IP相关常识
- WebApi实现原理解析笔记
- Java注解Annotation详解
- STL - priority_queue(优先队列)
- R语言学习 第十篇:操作符