| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1238 人关注过本帖
标题:太奇怪了 对象被删除 却不调用析构函数
只看楼主 加入收藏
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
结帖率:80%
收藏
 问题点数:0 回复次数:8 
太奇怪了 对象被删除 却不调用析构函数
用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;
}
搜索更多相关主题的帖子: 函数 对象 删除 
2008-09-25 20:01
出海之渔人
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-9-25
收藏
得分:0 
有点晕

我要学好C++,坚守住自己的理想!
2008-09-25 22:31
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#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;
}

学习需要安静。。海盗要重新来过。。
2008-09-26 14:04
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
收藏
得分:0 
楼上你的方法根本没有删除b1和b2,因为x的值没变 。

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

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-27 09:56
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
~b(){printf("对象被删除\n");}               //至始至终没调用它
我是为了证明调用这个代码。。。

学习需要安静。。海盗要重新来过。。
2008-09-27 10:38
BlueMouse
Rank: 1
来 自:贵州
等 级:新手上路
威 望:1
帖 子:52
专家分:0
注 册:2008-9-6
收藏
得分:0 
这样写代码的还真少见呀!不过这代码我怎么看你都没有使用到 class b 的对象和指针呀?

自然不会调用class b的析构函数了?难道我看不出来!
2008-09-27 11:07
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
收藏
得分:0 
可能是强制转换的问题
强制类型转换就会出现 析构函数被调用或不被调用的情况 如下



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

[[it] 本帖最后由 ml232528 于 2008-9-27 12:56 编辑 [/it]]

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-27 12:54
BlueMouse
Rank: 1
来 自:贵州
等 级:新手上路
威 望:1
帖 子:52
专家分:0
注 册:2008-9-6
收藏
得分:0 
晕!当然了!这样肯定是不会调用的!
2008-09-27 13:34
hbhbhb2008
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-3-4
收藏
得分:0 
我要删除自己的帖子 怎么没人发关于删帖子的主题呢
2008-11-12 19:17
快速回复:太奇怪了 对象被删除 却不调用析构函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014169 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved