C++中 destory() 和deallocate()以及delete函数的相关性和区别性
2014-08-23 15:40
211 查看
这里非常的绕口 需要仔细的来看看:
destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备
deallocate():真正的释放一个内存块。这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块。
看一个例子 应该就明白了真正的含义了:
#include <iostream> #include <stdlib.h> #include <unistd.h> using namespace std; class A { public: A() { data=new char[1000000]; } ~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 0; }
明显 这样的做法会出问题,运行到一定的时间内会抛出异常。所以deallocate只是释放对象内存,并没有调用对象的构造函数释放对象内的动态内存 这点要注意 如果调用了一个 allocat.destory(a); 程序就不会有bug了
所以在C++中, 对象释放和对象内动态内存释放是需要注意的 弄不好 就会出现内存泄露现象。
这里的delete操作符号本身带有2个动作:调用析构函数 2释放内存。而::operator delete就只有释放内存。 deallocate函数就是基于operator delete函数封装的。 这点需要记住
可以通过看STL源码发现 :像vector()的析构函数都是有2个操作: destory() 释放对象内的动态内存(如果有) deallocate是释放对象本身占有的内存 通过这2点 就能保证内存不能泄露了 嘿嘿 这节就说到这里哦 写这个也是为了记忆和方便以后查阅
相关文章推荐
- STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- C++中关于原始数据类型指针变量的new操作以及delete操作
- C++中的模板比较容易混淆的几个概念:类模板和类成员模板以及函数模板
- c++ static的作用,以及static对象在类和函数中区别
- C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API
- C++中的模板比较容易混淆的几个概念:类模板和类成员模板以及函数模板
- C++ 类的继承,子类以及之类的对象 对父类成员函数的访问权限
- 详解C++中的纯虚函数(虚函数区别)&多态性以及实例应用
- C++中delete, new以及new [], delete[]操作符内幕
- c++调用c函数 以及c调用c++函数
- C++中delete, new以及new [], delete[]操作符内幕
- c++中多态函数以及函数重载,覆盖,遮蔽(隐藏)的区别
- [c++ template]非类型的函数模板以及非类型的类的模板
- C++中delete, new以及new [], delete[]操作符内幕
- C++中delete, new以及new [], delete[]操作符内幕
- C++中类成员变量的初始化以及函数变量初始化
- c++的字符串char与string相互转化,以及string的,切割,替换字符,字符串相关的函数整理
- C中的malloc()函数和free()函数与C++中的new()函数和delete()函数详解
- 深入剖析C++继承,多态以及隐藏(一)。(虚函数探究)