STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
这里非常的绕口 需要仔细的来看看:
destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备
deallocate():真正的释放一个内存块。这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块。
看一个例子 应该就明白了真正的含义了:
1 #include <iostream> 2 3 #include <stdlib.h> 4 5 #include <unistd.h> 6 7 using namespace std; 8 9 class A 10 11 { 12 13 public: 14 15 A() 16 17 { 18 19 data=new char[1000000]; 20 21 } 22 23 ~A() 24 25 { 26 27 //free the data memory 28 29 delete []data; 30 31 } 32 33 private: 34 35 char *data; 36 37 }; 38 39 int main(int argc,char* argv[]) 40 41 { 42 43 for(;;) 44 45 { 46 47 A *a=new A; 48 49 std::allocator<A> allocat; 50 51 allocat.deallocate(a,sizeof(A)); 52 53 54 55 } 56 57 return 0; 58 59 }
View Code
明显 这样的做法会出问题,运行到一定的时间内会抛出异常。所以deallocate只是释放对象内存,并没有调用对象的构造函数释放对象内的动态内存 这点要注意 如果调用了一个 allocat.destory(a); 程序就不会有bug了
所以在C++中, 对象释放和对象内动态内存释放是需要注意的 弄不好 就会出现内存泄露现象。
这里的delete操作符号本身带有2个动作:调用析构函数 2释放内存。而::operator delete就只有释放内存。 deallocate函数就是基于operator delete函数封装的。 这点需要记住
可以通过看STL源码发现 :像vector()的析构函数都是有2个操作: destory() 释放对象内的动态内存(如果有) deallocate是释放对象本身占有的内存 通过这2点 就能保证内存不能泄露了
转载于:https://www.cnblogs.com/Kobe10/p/5656015.html
STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate相关推荐
- 剖析SGI STL空间配置器(deallocate内存回收函数和reallocate内存扩充函数)
剖析SGI STL空间配置器(deallocate内存回收函数和reallocate内存扩充函数) deallocate内存回收函数 deallocate函数的定义: static void deal ...
- SQL 中详解round(),floor(),ceiling()函数的用法和区别?
应用中使用四舍五入的值,我和我的用户在报表应用中的计算问题存在分歧.所有的代码都在T-SQL中,但是我认为报表问题与数据类型和向下取整或向上取整规则关系密切.请问您有没有这方面的高见?我想看到一些带有 ...
- 构造函数中调用构造函数new和delete使用小结
malloc free 是C语言的函数 new delete 是C++的操作符 #include "iostream" using namespace std;//构造中调用构造是 ...
- C++11 中STL库中新增内容
C++ 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到STL中了,本文就简单的介绍一下. 引用包装器(Reference Wrapper) 当模板函数参数为泛型类型的时候,无法 ...
- SQL Server中drop、truncate和delete语句的用法
SQL Server中drop.truncate和delete语句的用法 drop 删除表和表中的所有数据(不保留表的结构) drop table tablename truncate 删除表中 ...
- STL库中string类内存布局的探究
在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...
- c++中cend end_vector :: cend()函数以及C ++ STL中的示例
c++中cend end C ++ vector :: cend()函数 (C++ vector::cend() function) vector::cend() is a library funct ...
- 实验8.3 C++标准模板库(STL)中的双向队列类(deque)
题目 使用C++标准模板库(STL)中的双向队列类(deque)重新实现上一小题. C++代码如下: #include <iostream> #include <deque> ...
- Unity中Destory销毁对象不是立即销毁
Unity中 Destory()函数销毁对象时不是立刻销毁的,他是一个延迟执行的函数,是在当前帧之后,渲染帧之前销毁对象,例如下面代码: Destroy(transform.GetChild(0).g ...
最新文章
- Exchange Server 2007 移动邮件
- onnx.onnx_cpp2py_export.checker.ValidationError
- python3.7.2安装教程-CentOS 7安装Python教程
- php mysql 查询每隔一段时间插入的数据_SQL查询某个时间段共多少条数据
- HDFS(二)HDFS架构
- 缓冲流的效率测试_复制文件
- 知识蒸馏在推荐系统中的应用
- ubuntu10.04下audacious2.4源码编译过程(解决2.3cue的bug)
- .net数据绑定控件中的数据导出到Excel
- 实战演示 bacula 软件备份功能
- 节日礼物指南:清单上适合学习者,探索者或修补匠的书籍
- python列表推导式生成随机数_python 【迭代器 生成器 列表推导式】
- 硅谷再不是程序员们的梦想天堂了
- dataframe数组做元素_大数据技术之使用 DataFrame 读取复杂 JSON 中的嵌套数组
- docker: Error response from daemon: Unknown runtime specified nvidia.
- 让iphone死机的短信内容
- 【C/C++】简单的程序小游戏-推箱子代码
- chkdsk 停滞_职业停滞–早期发现和治疗
- layui实现动态多级菜单
- spring定时任务总结