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

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


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

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


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

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

struct mem_control_block { 
int is_available; 
int size; 
}; 

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

#include <iostream>

class Test {
    void *data;
    int n;
public:
    Test(int m) : n(m) {
       data = new int[n];
    std::cout << "Creat Object , Size = " << n << std::endl;
   }
    ~Test() {
    std::cout << "delete Object" << std::endl;
    delete []data; //OK, just releases storage, no destructor calls ara necessary
   }
};

int main()
{
    Test *test_1 = new Test(10);
    std::cout<<(long)test_1<<std::endl;
    delete test_1;
    void *test_2 = new Test(12);
    std::cout<<(long)test_2<<std::endl;
    delete test_2; 
    Test* t = new Test(13);//在delete test_2之后,new一块内存,打印的内存地址和刚才test_2的一样(证明内存释放了)
//但是如果Test类里面有char* p;之类的指针成员,指向了另外的内存,释放工作在析构函数完成,那么,由于上述的detele没有调用析构函数,造成泄露!
    std::cout<<(long)t<<std::endl;
    delete t;
    return 0;
}


输出:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值