Welcome to ErranLi's Blog!

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  106 Posts :: 1 Stories :: 97 Comments :: 0 Trackbacks

常用链接

留言簿(12)

搜索

  •  

积分与排名

  • 积分 - 172873
  • 排名 - 150

最新评论

阅读排行榜

用了这么久的C++,才发现C++是目前所有的编成语言中最为复杂的一种,C++之路,   艰难.....

   
            delete void *

           这一操作对于一些简单的系统内建类型不会有问题,但如果void*所指向的对象在析构函数里要释放,进行此造作会丢失内存,因为它不执行析构函数,例如:                               
                                    
class CEntity
{
public:
    CEntity(char flag);
    ~CEntity();
private:
    void * m_data;
   char   m_flag;
};

CEntity::CEntity(char flag)
{
   m_flag = flag;
    cout<<"constructing entity "<<m_flag<<endl;
    m_data = new char[100]; 
}

CEntity::~CEntity()
{
    cout<<"destructing entity "<<m_flag<<endl;
    delete[] m_data;
}

以上这个类是没什么问题的,但是看以下的调用:
int main(int argc, char* argv[])
{
       CEntity * a = new CEntity('a');
       delete a;

       void * b = new CEntity('b');
       delete b;
 
       return 0;
}

其输出为: constructing entity a
                       destructing entity a
                       constructing entity b                                    
可见,delete b 的时候没有释放m_data所指向的内存,没有执行析构函数。               
                     
               

posted on 2006-05-20 23:48 erran 阅读(2812) 评论(5)  编辑 收藏 引用 所属分类: C & C++

Feedback

# re: C++随笔 delete void * 2006-06-02 08:29 LOGOS
delete void*不太实用吧,有什么人会做这种事情呢  回复  更多评论
  

# re: C++随笔 delete void * 2006-06-02 14:02 erran
@LOGOS
哈哈, 这东西不到万不得以是不会用的了, 很危险的了, ^_^.....  回复  更多评论
  

# re: C++随笔 delete void * 2006-12-29 11:16 LifeAndC
刚看了你的: 怎样实现数目不定的函数参数

关于此篇:
想想数据在内存中的存储方式
void*可以持有不同类型的指针但不能保证被正确的解引用,因为不同类型的数据的size不同,存储方式不同,再想,你delete什么呢?

"用了这么久的C++,才发现C++是目前所有的编成语言中最为复杂的一种,C++之路, 艰难....."

C++是复杂,从你的这篇文章中证明不出C++的复杂来~
这个我认为很基础了~  回复  更多评论
  

# re: C++随笔 delete void * 2007-05-13 12:52 gameboy
hoho!!!谁说不实用?偶就在做delete void*的操作!!^_^,  回复  更多评论
  

# re: C++随笔 delete void * 2012-03-09 14:19
class CEntity
{
public:
CEntity(char flag);
~CEntity();
private:
void * m_data;
char m_flag;
};

CEntity::CEntity(char flag)
{
m_flag = flag;
cout<<"constructing entity "<<m_flag<<endl;
m_data = new char[100];
memset(m_data,1,100);
char* data= (char*)m_data;
cout << data << endl;
}

CEntity::~CEntity()
{
cout<<"destructing entity "<<m_flag<<endl;
delete[] m_data;
char* data= (char*)m_data;
cout << data << endl;
}

int main(int argc, char* argv[])
{
CEntity * a = new CEntity('a');
delete a;

void * b = new CEntity('b');
CEntity * a1 = (CEntity *)b;
delete a1;
if (b)
{
cout << "b is not delete";
}
getchar();
return 0;
}
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理