馨荣家园

室主感言:可以走错路,不可不走路,也不可总踩别人脚印走路。

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  51 随笔 :: 5 文章 :: 1326 评论 :: 18 Trackbacks
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

News

阿荣陋室更名为馨荣家园,寓指温馨和繁荣。

留言簿(195)

随笔分类

随笔档案

文章分类

文章档案

相册

友情链接

搜索

最新评论

阅读排行榜

评论排行榜

2007年4月29日 #

一般而言,如果基类定义了operator new,那么派生类也必须对应定义。
考虑下面的两个类
char * pAddress;
class CBase
{
public:
 static void* operator new(size_t size){return pAddress;};
 static void operator delete(void * p){};
};

class CDerive:public CBase
{
 char buffer[1024];
public:
 CDerive()
 {
  for(int i=0; i < 1024; i ++)
  {
   buffer[i] = i %26 + 'a';
  }
 }
};
当调用CDerive * p = new CDerive时,编译器首先尝试匹配该类自己的new,由于没有,编译器就尝试匹配在其祖先链上的new,于是调用CBase::operator new
但是基类其实不知道派生类任何信息,它仅仅根据CBase处理,因此构造了一个错误的类对象。

下面是我的测试代码,你可以发现在delete时程序报告p2指针被破坏,这就是因为CDerive得不到自己的1024字节内容,因此覆盖了后面的内容

void test()
{
 char *p1, * p2;
 p1 = new char[10];
 memset(p1,0,10);
 pAddress = new char[sizeof(CBase)];
 p2 = new char[10];
 memset(p2,0,10);
 CDerive *pDerive = new CDerive;
 TRACE(_T("%p\n"),pDerive);
 delete p1;
 delete p2;
 delete pAddress;
 
}

发表于 2007-04-29 22:33 馨荣家园 阅读(3333) | 评论 (9)编辑 收藏