- 这里非常的绕口 需要仔细的来看看:
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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/236682
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!