奇怪的this指针

sszwbuaa 2009-07-03 11:25:50

//CPdSubPrjIdx 派生于CRecordset
class CPdSubPrjIdx : public CRecordset
{
//。。。
}

//在CPdSubPrjIdx 类的成员函数中调用如下语句
int CPdSubPrjIdx::OpenTable(void)
{
//。。。
Open(CRecordset::snapshot, m_strTblName, CRecordset::none);
//。。。
}

//上面语句会调用CRecordset::Open函数,该函数又会调用下面的函数CRecordset::SetState
//跟踪到这个函数中,this指针发生了如下的变化,令我很崩溃- -!
void CRecordset::SetState(int nOpenType, LPCTSTR lpszSQL, DWORD dwOptions)
{
if (nOpenType == AFX_DB_USE_DEFAULT_TYPE)
m_nOpenType = m_nDefaultType;
else
m_nOpenType = nOpenType;

m_bAppendable = (dwOptions & appendOnly) != 0 ||
(dwOptions & readOnly) == 0;//在该语句之前this指针指向0x067fb060(CPdSubPrjIdx),可以理解
m_bUpdatable = (dwOptions & readOnly) == 0 &&
(dwOptions & appendOnly) == 0;//在执行该语句之后this指针指向0x00000000(CRecordset),为什么啊?????
// Can turn off dirty field checking via dwOptions
if (dwOptions & noDirtyFieldCheck || dwOptions & useMultiRowFetch)
m_bCheckCacheForDirtyFields = FALSE;

// Set recordset readOnly if forwardOnly
if (m_nOpenType == forwardOnly && !(dwOptions & readOnly))
{
TRACE(traceDatabase, 0, _T("Warning: Setting forwardOnly recordset readOnly.\n"));

dwOptions |= readOnly;

// If using multiRowFetch also set useExtendFetch
if (dwOptions & useMultiRowFetch)
dwOptions |= useExtendedFetch;
}

// Archive info for use in Requery
m_dwOptions = dwOptions;
m_strRequerySQL = lpszSQL;//在执行该语句之后this指针又指向0x067fa7d0(CRecordset),为什么啊?????
m_strRequeryFilter = m_strFilter;//在执行该语句之后this指针又指向0x783c8d14(CPdSubPrjIdx),崩溃了。。。。。
m_strRequerySort = m_strSort;
}
...全文
74 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sszwbuaa 2009-07-06
  • 打赏
  • 举报
回复
自己顶
motzyd 2009-07-06
  • 打赏
  • 举报
回复
this是常量指针,是不会改变的,你所观察到的改变,一定是是其他实例的this,例如构造函数中不同基类实例的this,或者通过空指针引用的实例
Fleeboy 2009-07-06
  • 打赏
  • 举报
回复
我也来帮你顶
baihacker 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sszwbuaa 的回复:]
引用 2 楼 taodm 的回复:
多试几个编译器(调试器)


这个和编译器有关?我用的是vs2005
[/Quote]
因为你watch到的,不一定可靠.
sszwbuaa 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
多试几个编译器(调试器)
[/Quote]
这个和编译器有关?我用的是vs2005
sszwbuaa 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
this指针重设,以指向相应内容,原因是继承...
[/Quote]
this指针重设的原理是什么,能说得细一些吗,多谢。
为什么会出现this指针指向0x00000000(CRecordset)的情况?
大前置 2009-07-03
  • 打赏
  • 举报
回复
成员函数和this指针
  类的成员函数和一个普通的(全局)函数可以认为没有什么差别。对于编译器来说,经
  过名称处理后(例如:在函数名称前面加上命名空间、类名),一个成员函数其实就是
  一个普通函数,在编译后的代码区域有着确定的函数体和函数入口。最大的差异发生在
  调用时,对于成员函数,编译器将隐含push this指针,this指针指向对象的地址(对象
  可能位于栈上或堆上或全局数据区),这就是操作所需要的数据(即成员数据)所在。
   …
   push p2
   push p1
   push object_pointer ; for C++ programmer, it is called “this” pointer
   call f
   …
  将数据和对于数据的操作捆在一起,正是面向对象语言中的封装思想,成员函数的需要
  访问成员数据,通过传递this指针
taodm 2009-07-03
  • 打赏
  • 举报
回复
多试几个编译器(调试器)
baihacker 2009-07-03
  • 打赏
  • 举报
回复
this指针重设,以指向相应内容,原因是继承...
sszwbuaa 2009-07-03
  • 打赏
  • 举报
回复
CRecordset::Open()函数声明如下
	virtual BOOL Open(UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL, DWORD dwOptions = none);


简单的说就是,当如下调用时Open(CRecordset::snapshot,NULL, CRecordset::none),
CRecordset的成员变量m_bUpdatable应该被设置为1啊(recordset可修改),实际却没有。
我是在vs2005中测试的,由开发过数据库的试一下,多谢拉 :)
tangwing 2009-07-03
  • 打赏
  • 举报
回复
挺乱……
Walf_ghoul 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Treazy 的回复:]
引用 9 楼 sszwbuaa 的回复:
我的问题其实主要在于 cordset::SetState()函数中的这句,

m_bUpdatable = (dwOptions & readOnly) == 0 &&
(dwOptions & appendOnly) == 0;

因为传入dwOptions的值为0,所以按理上述语句执行后 m_bUpdatable应该为1,
可执行完该函数后,m_bUpdatable仍为0。

所以我才怀疑this指针的问题,这应该和调试器无关吧。



1) 先确保代码无问题
2) 再确保你调式的时候不…
[/Quote]
顶个。。
sszwbuaa 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Treazy 的回复:]
1) 先确保代码无问题
2) 再确保你调式的时候不…
[/Quote]
1)代码在.net运行没问题,现在问题是代码升级到2005后产生的
2)没使用任何编译优化,实际内容也有问题
3)尝试中
thx!
Treazy 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sszwbuaa 的回复:]
我的问题其实主要在于 cordset::SetState()函数中的这句,

m_bUpdatable = (dwOptions & readOnly) == 0 &&
(dwOptions & appendOnly) == 0;

因为传入dwOptions的值为0,所以按理上述语句执行后 m_bUpdatable应该为1,
可执行完该函数后,m_bUpdatable仍为0。

所以我才怀疑this指针的问题,这应该和调试器无关吧。
[/Quote]

1) 先确保代码无问题
2) 再确保你调式的时候不要使用任何编译优化,如果你使用了优化,那实际内容与你看到的会不一致
3) 使用LOG输出去调式,这样能避免掉2的问题
sszwbuaa 2009-07-03
  • 打赏
  • 举报
回复
我的问题其实主要在于 cordset::SetState()函数中的这句,

m_bUpdatable = (dwOptions & readOnly) == 0 &&
(dwOptions & appendOnly) == 0;

因为传入dwOptions的值为0,所以按理上述语句执行后 m_bUpdatable应该为1,
可执行完该函数后,m_bUpdatable仍为0。

所以我才怀疑this指针的问题,这应该和调试器无关吧。
baihacker 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sszwbuaa 的回复:]
引用 6 楼 baihacker 的回复:
引用 5 楼 sszwbuaa 的回复:
引用 2 楼 taodm 的回复:
多试几个编译器(调试器)


这个和编译器有关?我用的是vs2005


因为你watch到的,不一定可靠.


编译器也会撒谎,听起来有些恐怖。。。
[/Quote]
在这里是调试器.
sszwbuaa 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 baihacker 的回复:]
引用 5 楼 sszwbuaa 的回复:
引用 2 楼 taodm 的回复:
多试几个编译器(调试器)


这个和编译器有关?我用的是vs2005


因为你watch到的,不一定可靠.
[/Quote]
编译器也会撒谎,听起来有些恐怖。。。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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