本篇日志,纯属娱乐,没有太大实用价值,在百度上面看到,借题发挥而已……
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { int* pi = (int*)malloc(sizeof(int)); free((char*)pi); return 0; } |
这段程序的内存能完全释放吗?答案是能。
看free函数的原型:void free(void*); 可知,无论你传给它什么类型的指针,它内部都是按照没有类型的void*来处理的。堆管理器会帮程序处理这一切,它记录了你先前申请的这块内存的大小,它看到的只是一块内存,没有任何类型之类的东西。
再看下面这段代码:
1 2 3 4 5 6 7 8 9 | #include <iostream> using namespace std; int main() { int* pi = new int; delete (char*) pi; return 0; } |
这里的内存被正确释放了吗?答案我也不知道……还请看到的高手解答^_^:-)
接着看,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> using namespace std; class demo { public: //~ 此处省略代码数行…… ~demo() { delete [] pi; } private: int * pi; }; int main() { demo * pd = new demo; delete (char*)pd; return 0; } |
这里的内存会被正确释放吗?答案要分两方面来讨论。*pd对象本身的内存(4Byte)会不会被释放,就像上例中所说,我还是不知道。但(*pd)::pi所指向的内存肯定是打了水漂啦!因为delete看到的只是一个char*类型的pd,只会简单做一些处理(待高人讲解),而不会调用析构函数demo::~demo()。甚至有时候它还可能调用其他类的析构函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream> using namespace std; class demo { public: //~ 此处省略代码数行…… ~demo() { delete [] pi; } private: int * pi; }; class foo { public: ~foo(){cout<<"foo's collapsing..."<<endl; }; int main() { demo * pd = new demo; delete (foo*)pd; return 0; } |
foo童鞋真是可怜,让我们来了个借尸还魂,Orz,是借刀杀人才对!
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
我和同学讨论了这个问题,你可以看看。
http://www.felix021.com/blog/read.php?1715
已拜读