STL–C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate

  • 这里非常的绕口 需要仔细的来看看:

destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备

deallocate():真正的释放一个内存块。这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块。

看一个例子 应该就明白了真正的含义了:

  • STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocateSTL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午5:07
下一篇 2023年2月13日 下午5:08

相关推荐