在一个类中定义另外一个类的指针问题

ZOthello 2009-03-20 04:22:49
在CSetPage类中定义了一个指向CRequst 类的指针:
class CSetPage : public CPropertyPage
{
DECLARE_DYNCREATE(CSetPage)

// Construction
public:
CRequst * m_req;

但是我在send函数中按如下方法使用这个m_req时,这句if (m_req==NULL)代码却出现访问错误,这个m_reg变量好像就没有给分配空间一样。这是什么原因?

void CSetPage::Send()
{

if (m_req==NULL)
{
m_req= new CRequst();
}
m_req->buf="hello";
m_req->data="socket";
m_req->number=2;
...全文
453 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZOthello 2009-03-22
  • 打赏
  • 举报
回复
的确是CSetPage实例出了问题,多谢各位!结贴散分!
sundebing 2009-03-21
  • 打赏
  • 举报
回复
构造函数初始化为NULL
charles_y 2009-03-21
  • 打赏
  • 举报
回复
错误很可能是你的CSetPage实例出了问题,看看是不是这个实例之前已经被销毁了,你可以在这个类的析构函数中加断点调试一下
UltraSoundX 2009-03-21
  • 打赏
  • 举报
回复
1,一种可能就是别的地方破坏了CSetPage中的m_req指针,如某个地方删除了它;
2,CSetPage若是只针对象,则确认下它是否在别的地方被干掉了(若方便,则在析构函数中set breakpoint看看是谁干掉的);
3,以上都不是,重新编译。
ZOthello 2009-03-21
  • 打赏
  • 举报
回复
CSetPage的实例为什么不存在呢?我在CPropertySheet里面实例化过了啊,我另外一个类的指针都好着~~
assassin5616 2009-03-21
  • 打赏
  • 举报
回复
错误原因是CSetPage的实例不存在,检查一下是不是CSetPage在某个地方被销毁了
xylicon 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 skysolo 的回复:]
错误代码:Unhandle exception in client.exe :0xC0000005,Access violation。

123: if (m_req==NULL)
00404C22 mov eax,dword ptr [ebp-10h]
00404C25 cmp dword ptr [eax+90h],0 //这句汇编代码有问题,eax= CDCDCDCD,貌似是第一个[ebp-10h]
没有去到正确的值。
00404C2C jne CSetPage::Send+95h (00404c85)
[/Quote]

貌似是eax是野指针,也就是存放m_req的地址&m_req已经不可用了。也许是程序某个地方破坏了对象的某些内存。
  • 打赏
  • 举报
回复
再写个其它的类 试试 如果没问题 就是你的CRequest有问题, 如果有问题就是你的CSetPage有问题
ZOthello 2009-03-20
  • 打赏
  • 举报
回复
改为m_req=new CRequest();
也没有用!
ZOthello 2009-03-20
  • 打赏
  • 举报
回复
错误代码:Unhandle exception in client.exe :0xC0000005,Access violation。

123: if (m_req==NULL)
00404C22 mov eax,dword ptr [ebp-10h]
00404C25 cmp dword ptr [eax+90h],0 //这句汇编代码有问题,eax= CDCDCDCD,貌似是第一个[ebp-10h]
没有去到正确的值。
00404C2C jne CSetPage::Send+95h (00404c85)
cheidtf 2009-03-20
  • 打赏
  • 举报
回复
只看到使用New,并没有看到你delete,

而且你用得好像是多面页类,不知道切换到其它的页面时,会不会其它的动作.

仔细看看哪里还有对这个变量做操作.VX助手能够很好查看的.
ghost129 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 skysolo 的回复:]
我就初始化为:

CSetPage::CSetPage() : CPropertyPage(CSetPage::IDD)
{
pConnsocket=NULL;
m_req=NULL;
//{{AFX_DATA_INIT(CSetPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
[/Quote]

画红线部分改为m_req=new CRequest();试试.
xylicon 2009-03-20
  • 打赏
  • 举报
回复
这个问题比较奇怪,即使m_req是野指针,也不应该在if (m_req==NULL)这句话出错的,即使是野指针,也是有值的,有值就可以跟NULL比较。

话说回来,m_req作为CSetPage的一个成员,出现成员变量访问错误,我只能想到是CSetPage对象本身不存在了。
ghost129 2009-03-20
  • 打赏
  • 举报
回复
...这句if (m_req==NULL)代码却出现访问错误,这个m_reg变量好像就没有给分配空间一样....
不知道错误提示是怎样的,楼主可否贴出来?
ZOthello 2009-03-20
  • 打赏
  • 举报
回复
是不是我自己定义的类有问题啊?
ZOthello 2009-03-20
  • 打赏
  • 举报
回复
我就初始化为:

CSetPage::CSetPage() : CPropertyPage(CSetPage::IDD)
{
pConnsocket=NULL;
m_req=NULL;

//{{AFX_DATA_INIT(CSetPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
ZOthello 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
是因为你使用的CSetPage对象本身不存在。
[/Quote]
为什么这个对象不存在呢?我在CSetPage里还使用了CAsyncSocket *m_socket这个类指针都没有问题啊,但是我自己定义的类CRequst就不对了~~
pangqi022 2009-03-20
  • 打赏
  • 举报
回复
我也出过同样的问题
我是这样做的


A::A()
{
m_p = new B();//m_p 是LPVOID类型的....
}

A::fun()
{
delete m_p; //异常
}
oyljerry 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skysolo 的回复:]
楼上的。我当然初始化了,这么简单我能来问吗?
[/Quote]
怎么初始化的,是否正确赋值等
littlefangMFC 2009-03-20
  • 打赏
  • 举报
回复
学习
加载更多回复(11)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧