| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1238 人关注过本帖
标题:太奇怪了 对象被删除 却不调用析构函数
取消只看楼主 加入收藏
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
结帖率:80%
收藏
 问题点数:0 回复次数:2 
太奇怪了 对象被删除 却不调用析构函数
用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
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
收藏
得分:0 
楼上你的方法根本没有删除b1和b2,因为x的值没变 。

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

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-27 09:56
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
快速回复:太奇怪了 对象被删除 却不调用析构函数
数据加载中...
 
   



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

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