急急急急急急急 this指针突然为NULL了
我在CMyView的一个成员函数中定义了一个结构变量
CMyView::MyFunc()
{
int i = 0;
tagMYDATA MyData;
这之后突然i为一个很大的数并且每次都不一样
调试窗口中的this变为NULL了
}
tagMYDATA 定义如下:头文件中
class AFX_EXT_CLASS tagMYDATA
{
char myBuf[25];
...
一系列的字符数组 就像MyBuf一样
int MyCount;
...
一系列int变量
CTime tm;
}
实现里CPP文件:
在构造与析构中
{
memset(myBuf,0,sizeof(myBuf)/sizeof(char));
...
MyCount = 0;
...
tm=CTime::GetCurrentTime();
}
注: 这个结构tagMYDATA是在一个EXT DLL工程中 ,做为导出用
并在MyView的工程中也包含了这个MyData.h文件
求助!
问题点数:40、回复次数:14Top
1 楼xlt123(杀了你好吗)回复于 2004-09-03 18:56:32 得分 5
可能是你的 tagMYDATA 定义得太大了,
tagMYDATA MyData在栈中分配空间,会破坏栈的.
你在堆中分配可能会好一点
lpMyData = new tagMYDATA
...
delete lpMyDataTop
2 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2004-09-03 19:11:09 得分 0
to :: xlt123(杀了你好吗)
我先试试你的方法
谢谢你的回复Top
3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-09-03 19:16:55 得分 2
用堆分配吧Top
4 楼huanyun(无妻徒刑)回复于 2004-09-03 19:21:52 得分 5
class AFX_EXT_CLASS tagMYDATA
有越界行为 看看 是不是单bit编译与单字节编译同时使用Top
5 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2004-09-03 19:23:35 得分 0
我结构定义为
{
char szBuf1[25];
char szBuf2[50];
char szBuf3[50];
char szBuf4[10];
char szBuf5[20];
UINT n1;
UINT n2;
BOOL bKilled;
CTime tm;
}
这个不很大吧? 我想一个函数的栈能容纳的下吧?
Top
6 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2004-09-03 19:47:24 得分 0
to: huanyun(无妻徒刑)
class AFX_EXT_CLASS tagMYDATA
有越界行为 看看 是不是单bit编译与单字节编译同时使用
不是很懂,能再说的明白一些吗?
非常感谢Top
7 楼rwdx(忆)回复于 2004-09-03 20:41:34 得分 0
CMyView::MyFunc()
{
int i = 0;
tagMYDATA MyData;
这之后突然i为一个很大的数并且每次都不一样
调试窗口中的this变为NULL了
}
你的i在声明后就没有使用了吧,编译器优化好像会把i 释放了Top
8 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2004-09-03 20:43:31 得分 0
我的 i 在tagMyDATA MyData 有使用过Top
9 楼CaptainIII(山上人)回复于 2004-09-03 21:36:35 得分 0
dll没有写给,不过看你的结构定义,应该没有问题Top
10 楼jiangsheng(蒋晟.Net[MVP])回复于 2004-09-04 07:04:49 得分 3
看起来很像访问越界Top
11 楼holyeagle(一杯清茶)回复于 2004-09-04 08:15:28 得分 5
应该是在析构函数里面出错,检查memset是否越界,另外把CTime tm改为指针CTime *ptm,用的时候分配空间,这样结构的体积就不会很大,也有可能是这边造成堆栈越界。Top
12 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2004-09-04 09:13:48 得分 0
但是我在其他的地方 如在CMainFrame中这样来用,
就没有任何的错误,
前几天都没有发现什么问题,就是今天出现一个“访问违例"的错误。
Top
13 楼xlt123(杀了你好吗)回复于 2004-09-04 11:52:32 得分 20
栈的问题:
函数没有单独的栈,整个进程是共用一个栈。每个进程的默认栈空间是1M
通常说C语言是基于栈,指的是C的临时变量在栈中分配.分配伪代码如下
假设栈指针为 SP (stack point),另外假设有一个东西 BP (其实是寄存器)
* SP = BP;
BP = SP;
SP -= XXX; //(分配临时变量空间)
假设变量定义如下: XXX = 4+4+4+8
int a; //(4 bytes)
long b; //(4 bytes)
float c; //(4 bytes)
double d; //(8 bytes)
...
则变量分配可能如下:
BP[0] = &a
BP[4] = &b
BP[8] = &c
BP[12] = &d
释放空间恢复栈指针:
SP += XXX;
SP = BP;
BP = * SP;
return;
这么写主要是为了支持递归
当函数嵌套或递归调用时, SP 就会不断的变小,最终可能会把1M耗尽,这就是常说的
堆栈溢出。
如果你的函数调用没有太多的嵌套,应该不会有什么问题.
但如果嵌套较多,或调用频繁,可能就出问题了。不仅仅是堆栈溢出.
this指针也在栈中,当你给变量赋值时,就是向栈里写东西,
如果访问越界,就会破坏this.
所以,当需要分配一块比较大的空间时,最好用 new 在堆中分配。
或者用 Windows内存管理函数 VirtualAlloc,GlobalAlloc,HeapAlloc等等。
如果不是这个问题,那就是你别的地方有非法操作。好好查查吧。
另,sizeof(CTime) = 4,不是很大.
Top
14 楼Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)回复于 2004-09-05 18:53:54 得分 0
谢谢各位热心的参到与帮助!!
Top




