本篇日志,纯属娱乐,没有太大实用价值,在百度上面看到,借题发挥而已……

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,是借刀杀人才对!

Tags: ,.
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

RFC: Request For Comments. Orz..

Name(required)
Mail (required),(will not be published)
Website(recommended)