程序运行一段时间后,this指针自动变为NULL的可能原因

时间:2022-03-01 15:25:03
有一个类, 并在全局范围内 创建一个对象(注:不是new出来的);
类似 MyClass  my; 这样.

然后在其它地方使用这个类的成员函数做一些事.

然后在运行一段时间后(时间随机的), VC6.0就断在这个类的 "成员函数中" 访问成员变量的地方, 并且在"自动变量"窗口中显示this指针为0x00000了,也就是this指针自动变成NULL了.

所以想请大家, 都帮我想想, 可能会有哪些原因会导致this指针变为NULL;

(注: 因为不是new出来的, 就不存在被我主动释放的问题)

18 个解决方案

#1


诸多可能呀,还是在this没变化的时候打个断点,慢慢跟吧,看看是在什么地方this值被修改。

#2


看堆栈

#3


像是 memory corruption

#4


最有可能的原因是,你其它地方的代码在分配内存的时候,产生越界而导致把MyClass实例的指针覆盖了,而恰好覆盖的数据是0,所以当成NULL指针了。

#5


你这恐怕是因为初始化顺序造成的。最好上关键代码

#6


在main处设置&my地址处的内存断点,每次内存有改动就会断下来,这样就查看出来了

#7


调用堆栈我看过, 前面几层中的函数参数都是正确,合法的.

#8


这个错误不是必然出的, 是偶然性发生的, 我循环调用1W次, 可能前面几个1W次都正常,然后在后面的某个1W次中的某一次,程序就出现, 有时候又是其它问题.
比如调用堆栈上看到只有汇编代码的地方

00000000()  --->停在这里, 这种错误不是this指针为NULL的错,是另一种错.
00f9faa4()

#9


To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint. 

#10


基本上是内存越界使用了

#11


内存越界覆盖

#12


有没有内存范围异常?

#13


有时候可以看见内存异常, 说有一个堆在释放后被修改,但这个是发生在别人的库里,没有源码.看不到.

看来得下数据改变断点了, 因为不只是变NULL, 有时候会把this变成一个其它的指针.

#14


引用 9 楼  的回复:
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the varia……

this指针变化,怎么设置呢,可以在Expression text box中写 &xxx 取对象的地址吗.

#15


引用 13 楼  的回复:
有时候可以看见内存异常, 说有一个堆在释放后被修改,但这个是发生在别人的库里,没有源码.看不到.

看来得下数据改变断点了, 因为不只是变NULL, 有时候会把this变成一个其它的指针.

一般这种看似随机,变化莫名其妙的都是内存误操作引起的,比如说数组越界,指针类型不对等等。程序最后挂在别人的库里面,并不说明就一定是该库的问题,很可能错误早就发生了,只不过到挂的地方错误才严重到不得不挂。建议楼主还是仔细查找程序中是否存在内存操作错误。

#16


一般我遇到这种问题都会先怀疑是自己的代码问题, 然后作全面的排除工作,最后实在是没办法了,才怀疑是库的问题。

现在阅读了这个库的说明文档后, 后到有另一个相同功能的函数可用, 使用后测试过程中就没有这种问题产生了。 

最让人郁闷的是, 说明文档中都建议使用我后面使用的函数, 但是其例子程序中竟然没有使用这个函数。 也属于阅读文档不仔细吧。

#17


结贴了, 基本上应该是某个地方访问越界造成的, 只是没法跟踪, 心里总有个疙瘩。
现在的只是把这个问题绕过去了。

#18


引用 17 楼  的回复:
结贴了, 基本上应该是某个地方访问越界造成的, 只是没法跟踪, 心里总有个疙瘩。
现在的只是把这个问题绕过去了。

为什么不使用数据改变断点定位到this指针被修改的非法代码处呢?

#1


诸多可能呀,还是在this没变化的时候打个断点,慢慢跟吧,看看是在什么地方this值被修改。

#2


看堆栈

#3


像是 memory corruption

#4


最有可能的原因是,你其它地方的代码在分配内存的时候,产生越界而导致把MyClass实例的指针覆盖了,而恰好覆盖的数据是0,所以当成NULL指针了。

#5


你这恐怕是因为初始化顺序造成的。最好上关键代码

#6


在main处设置&my地址处的内存断点,每次内存有改动就会断下来,这样就查看出来了

#7


调用堆栈我看过, 前面几层中的函数参数都是正确,合法的.

#8


这个错误不是必然出的, 是偶然性发生的, 我循环调用1W次, 可能前面几个1W次都正常,然后在后面的某个1W次中的某一次,程序就出现, 有时候又是其它问题.
比如调用堆栈上看到只有汇编代码的地方

00000000()  --->停在这里, 这种错误不是this指针为NULL的错,是另一种错.
00f9faa4()

#9


To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint. 

#10


基本上是内存越界使用了

#11


内存越界覆盖

#12


有没有内存范围异常?

#13


有时候可以看见内存异常, 说有一个堆在释放后被修改,但这个是发生在别人的库里,没有源码.看不到.

看来得下数据改变断点了, 因为不只是变NULL, 有时候会把this变成一个其它的指针.

#14


引用 9 楼  的回复:
To set a breakpoint when a variable changes value 

From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the varia……

this指针变化,怎么设置呢,可以在Expression text box中写 &xxx 取对象的地址吗.

#15


引用 13 楼  的回复:
有时候可以看见内存异常, 说有一个堆在释放后被修改,但这个是发生在别人的库里,没有源码.看不到.

看来得下数据改变断点了, 因为不只是变NULL, 有时候会把this变成一个其它的指针.

一般这种看似随机,变化莫名其妙的都是内存误操作引起的,比如说数组越界,指针类型不对等等。程序最后挂在别人的库里面,并不说明就一定是该库的问题,很可能错误早就发生了,只不过到挂的地方错误才严重到不得不挂。建议楼主还是仔细查找程序中是否存在内存操作错误。

#16


一般我遇到这种问题都会先怀疑是自己的代码问题, 然后作全面的排除工作,最后实在是没办法了,才怀疑是库的问题。

现在阅读了这个库的说明文档后, 后到有另一个相同功能的函数可用, 使用后测试过程中就没有这种问题产生了。 

最让人郁闷的是, 说明文档中都建议使用我后面使用的函数, 但是其例子程序中竟然没有使用这个函数。 也属于阅读文档不仔细吧。

#17


结贴了, 基本上应该是某个地方访问越界造成的, 只是没法跟踪, 心里总有个疙瘩。
现在的只是把这个问题绕过去了。

#18


引用 17 楼  的回复:
结贴了, 基本上应该是某个地方访问越界造成的, 只是没法跟踪, 心里总有个疙瘩。
现在的只是把这个问题绕过去了。

为什么不使用数据改变断点定位到this指针被修改的非法代码处呢?