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; }
输出:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。