设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 2043|回复: 8
打印 上一主题 下一主题

太奇怪了 对象被删除 却不调用析构函数

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-5 01:00:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用a类的静态成员函数Createit 创建几个b类连续的内存空间 再用Freeit删除它 去不调用b类析构函数
源代码如下:



#include <stdio.h>
#include <tchar.h>
#include<windows.h>


class a
{
public:
    a *data(){return this+1;}
    static a* Createit(a*& head,UINT m,UINT n);
    void Freeit();   
};

a *a::Createit(a*& head, UINT m, UINT n)
{
    head=(a*)new BYTE[sizeof(a)+m*n];
    return head;
}

void a::Freeit()
{
    a* p=this;
    BYTE *p1=(BYTE*)p;
    delete[] p1;   
}





class b
{
public:
    int x;
    ~b(){printf("对象被删除\n");}               //至始至终没调用它
};



int _tmain(int argc, _TCHAR* argv[])
{   
    a* p=a::Createit(p,5,sizeof(b));
    b *b1=(b*)p->data();
    b *b2=b1+1;
    b1->x=5;b2->x=6;
    printf("b1->x=%d,b2->x=%d\n",b1->x,b2->x);
    p->Freeit();                                 //删除对象
    printf("b1->x=%d,b2->x=%d\n",b1->x,b2->x);
    getchar();   
    return 0;
}
2#
发表于 2009-11-5 01:00:18 | 只看该作者
有点晕
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-5 01:00:19 | 只看该作者
#include <stdio.h>
#include <tchar.h>
#include<windows.h>
class b
{
public:
    int x;
    b(){};
    ~b(){printf("对象被删除\n");}               //至始至终没调用它
};

class a
{
public:
    a *data(){return this+1;}
    static a* Createit(a*& head,UINT m,UINT n);
    void Freeit();   
};

a *a::Createit(a*& head, UINT m, UINT n)
{
    head=(a*)new BYTE[sizeof(a)+m*n];
    return head;
}

void a::Freeit()
{
    //a* p=this;
    b *p1=new b();
    delete p1;   
}









int _tmain(int argc, _TCHAR* argv[])
{   
    a* p=a::Createit(p,5,sizeof(b));
    b *b1=(b*)p->data();
    b *b2=b1+1;
    b1->x=5;b2->x=6;
    printf("b1->x=%d,b2->x=%d\n",b1->x,b2->x);
    p->Freeit();                                 //删除对象
    printf("b1->x=%d,b2->x=%d\n",b1->x,b2->x);
    getchar();   
    return 0;
}
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-5 01:00:20 | 只看该作者
楼上你的方法根本没有删除b1和b2,因为x的值没变 。

运行楼主的程序可以看到, x的值很奇怪,说明b1和b2已被删除了
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-5 01:00:21 | 只看该作者
~b(){printf("对象被删除\n");}               //至始至终没调用它
我是为了证明调用这个代码。。。
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-5 01:00:22 | 只看该作者
这样写代码的还真少见呀!不过这代码我怎么看你都没有使用到 class b 的对象和指针呀?

自然不会调用class b的析构函数了?难道我看不出来!
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-5 01:00:24 | 只看该作者
可能是强制转换的问题
强制类型转换就会出现 析构函数被调用或不被调用的情况 如下



#include<iostream>
using namespace std;


class a
{
public:
    int x;
    a(){cout<<"对象被创建"<<endl;}
    ~a(){cout<<"对象被删除"<<endl;}
};

int main()
{
    unsigned char *b1=new unsigned char[sizeof(a)];
    delete (a*)b1;                  //调用了析构函数 但b1不是a类
    a* a1=new a;
    delete (int*)a1;                //不调用析构函数 虽然a1是a类
    getchar();   
    return 0;
}
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-5 01:00:25 | 只看该作者
晕!当然了!这样肯定是不会调用的!
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-5 01:00:26 | 只看该作者
我要删除自己的帖子 怎么没人发关于删帖子的主题呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 07:25 , Processed in 0.091142 second(s), 10 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表