一个论坛上看到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;
}
输出: