-
这里非常的绕口 需要仔细的来看看:
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 }
明显 这样的做法会出问题,运行到一定的时间内会抛出异常。所以deallocate只是释放对象内存,并没有调用对象的构造函数释放对象内的动态内存 这点要注意 如果调用了一个 allocat.destory(a); 程序就不会有bug了
所以在C++中, 对象释放和对象内动态内存释放是需要注意的 弄不好 就会出现内存泄露现象。
这里的delete操作符号本身带有2个动作:调用析构函数 2释放内存。而::operator delete就只有释放内存。 deallocate函数就是基于operator delete函数封装的。 这点需要记住
可以通过看STL源码发现 :像vector()的析构函数都是有2个操作: destory() 释放对象内的动态内存(如果有) deallocate是释放对象本身占有的内存 通过这2点 就能保证内存不能泄露了