您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-21 10:05 309 查看
一个论坛上看到k2eats对着个问题的回答,受益匪浅;

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

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

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

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

[cpp] view
plain copy

 





struct mem_control_block {   

int is_available;   

int size;   

};   

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

[cpp] view
plain copy

 





#include <iostream>  

  

class Test {  

    void *data;  

    int n;  

public:  

    Test(int m) : n(m) {  

       data = new int
;  

    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;  

}  

输出:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ delete 内存