找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 2049|回复: 8

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

[复制链接]
发表于 2009-11-5 01:00:17 | 显示全部楼层 |阅读模式 IP:江苏扬州
用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;
}
发表于 2009-11-5 01:00:18 | 显示全部楼层 IP:江苏扬州
有点晕
回复

使用道具 举报

发表于 2009-11-5 01:00:19 | 显示全部楼层 IP:江苏扬州
#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;
}
回复

使用道具 举报

发表于 2009-11-5 01:00:20 | 显示全部楼层 IP:江苏扬州
楼上你的方法根本没有删除b1和b2,因为x的值没变 。

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

使用道具 举报

发表于 2009-11-5 01:00:21 | 显示全部楼层 IP:江苏扬州
~b(){printf("对象被删除\n");}               //至始至终没调用它
我是为了证明调用这个代码。。。
回复

使用道具 举报

发表于 2009-11-5 01:00:22 | 显示全部楼层 IP:江苏扬州
这样写代码的还真少见呀!不过这代码我怎么看你都没有使用到 class b 的对象和指针呀?

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

使用道具 举报

发表于 2009-11-5 01:00:24 | 显示全部楼层 IP:江苏扬州
可能是强制转换的问题
强制类型转换就会出现 析构函数被调用或不被调用的情况 如下



#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;
}
回复

使用道具 举报

发表于 2009-11-5 01:00:25 | 显示全部楼层 IP:江苏扬州
晕!当然了!这样肯定是不会调用的!
回复

使用道具 举报

发表于 2009-11-5 01:00:26 | 显示全部楼层 IP:江苏扬州
我要删除自己的帖子 怎么没人发关于删帖子的主题呢
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 09:42 , Processed in 0.296879 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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