不是很难,可我就是搞不定

CoolHg 2001-06-14 05:40:00
typedef struct _Interface
{
virtual long AddRef()=0;
virtual long Release()=0;
virtual BOOL Test( char* mess)=0;
}Interface;

class T : public Interface
{
public:
virtual long AddRef()
{
m_Ref++;
return m_Ref;
}
virtual long Release()
{
m_Ref--;
if(m_Ref==0)
{
delete this;
return 0;
}
return m_Ref;
}

virtual BOOL Test( char* mess)
{
MessageBox( NULL, mess, "", MB_OK );
return TRUE;
}
T():m_Ref(0)
{};

protected:
m_Ref;
};
BOOL Create(PVOID** pVal)
{
T* p1;
p1 = new T;
*pVal = p1;


T** p;
p=(T**)new T*;
p[0] = new T;
p[1] = new T;
p[2] = new T;
p[3] = new T;

p[0]->AddRef();
p[0]->Test("1");
p[0]->Relaese();

p[1]->AddRef();
p[1]->Test("2");
p[1]->Relaese();

p[2]->AddRef();
p[2]->Test("3");
p[2]->Relaese();

p[3]->AddRef();
p[3]->Test("4");
p[3]->Relaese();

return TRUE;
}

void F()
{
Interface* p;
Create(&p);

p->Test("5");
p->Release();
}

其中Create是在DLL中,而F()是在EXE主调程序中,装入DLL等已省略,运行时 F()中的消息框可以出现,但是关闭消息框后出现应用错误,但是如果把Create中的p[2],p[3]的分配与调用去调后一切正常,还有如果Create中去掉输出类的创建出不会出现这种错误
...全文
83 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
plato 2001-06-15
你要new的是对象指针的数组,不是对象的树组
  • 打赏
  • 举报
回复
plato 2001-06-15
p=(T**)new T[4]; -〉不对吧?应该是p=(T**)new PT[4]
  • 打赏
  • 举报
回复
CoolHg 2001-06-15
1。其实不用AddRef,因为在release中是用m_Ref<=0来判断的
2。这里的Interface我是从COM原理中学来的,没错儿

我原来是这样写的
p=(T**)new T[4];
因为出错就改成了
p=(T**)new T*;

可今天改回原来那样又正常了
  • 打赏
  • 举报
回复
plato 2001-06-15
还有:把Interface改成Class的定义试试看?
class Interface
{
public:
virtual long AddRef()=0;
virtual long Release()=0;
virtual BOOL Test( char* mess)=0;
};
  • 打赏
  • 举报
回复
plato 2001-06-15
p1 = new T;后,为什么没有p1->AddRef()?
  • 打赏
  • 举报
回复
CoolHg 2001-06-15
plato(天天)
你这样可就分配了一个三维数组了,我试了一下,不行

经我稍调试了一下,好象是先把p[0] - p[3]删除后破坏了内存分配记录块
  • 打赏
  • 举报
回复
plato 2001-06-14
这个明显不对啊!
先typdef P* PT;
然后:
T** p;
p=(T**)new T*; ->改为p = (T**) new PT[4];否则分配数租只有一个元素
p[0] = new T;
p[1] = new T;
p[2] = new T;
p[3] = new T;
  • 打赏
  • 举报
回复
CoolHg 2001-06-14
我把
T* p1;
p1 = new T;
*pVal = p1;
移到最后return前暂正常
  • 打赏
  • 举报
回复
CoolHg 2001-06-14
这样动态分配class数组是否不妥,另外Interface中的函数实际声明如下;
virtual long __stdcall AddRef() = 0 ;
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
申请成为版主
帖子事件
创建了帖子
2001-06-14 05:40
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……