delete一个void*可能会造成泄漏内存

一个论坛上看到k2eats对着个问题的回答,受益匪浅;


delete void*在删除内建类型是没有问题的.系统在malloc()的时候已经在分配的内存块记录了分配内存的大小,所以不存在不知道不知道释放多少内存的说法

对于int a = new int[15];           delete a 与 delete []a 是等效的。


本身不会泄露内存,因为:
在堆中分配内存的时候,空闲内存是按照链表连接起来的,释放内存则将内存块链到空闲链上面去,

关键是分配的时候不只是分配你所需求的内存大小,前面还要分配如下一个结构体内存的大小:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. struct mem_control_block {   
  2. int is_available;   
  3. int size;   
  4. };   

这称为内存控制块,用于标志此块内存的大小以及是否可用,后面才是实际分配的内存空间,那么不管你的指针是什么
类型的,当调用delete运算符的时候,就会将此块内存块的is_available标志标记为可以使用(空闲),等于释放了内存。
但是对于C++的类,确实存在一个问题,因为这样不会调用析构函数,因为类型已经丢失,如果类里面存在一个指针类型,
指向了另一块内存,可能使得这块内存泄露。而类本身占据的内存不会泄露,就拿刚才楼上的类举个例子:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2.   
  3. class Test {  
  4.     void *data;  
  5.     int n;  
  6. public:  
  7.     Test(int m) : n(m) {  
  8.        data = new int[n];  
  9.     std::cout << "Creat Object , Size = " << n << std::endl;  
  10.    }  
  11.     ~Test() {  
  12.     std::cout << "delete Object" << std::endl;  
  13.     delete []data; //OK, just releases storage, no destructor calls ara necessary  
  14.    }  
  15. };  
  16.   
  17. int main()  
  18. {  
  19.     Test *test_1 = new Test(10);  
  20.     std::cout<<(long)test_1<<std::endl;  
  21.     delete test_1;  
  22.     void *test_2 = new Test(12);  
  23.     std::cout<<(long)test_2<<std::endl;  
  24.     delete test_2;   
  25.     Test* t = new Test(13);//在delete test_2之后,new一块内存,打印的内存地址和刚才test_2的一样(证明内存释放了)  
  26. //但是如果Test类里面有char* p;之类的指针成员,指向了另外的内存,释放工作在析构函数完成,那么,由于上述的detele没有调用析构函数,造成泄露!  
  27.     std::cout<<(long)t<<std::endl;  
  28.     delete t;  
  29.     return 0;  
  30. }  


输出:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值