CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

急急急急急急急 this指针突然为NULL了

楼主Juchiyufei(三更半夜我送你回家.总统也许我做不到.今生难得的遇见你,我们就应该在一起.....)2004-09-03 18:38:44 在 VC/MFC / 进程/线程/DLL 提问

 
   
        我在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

相关问题

  • 急!!!急!!!急!!! 关于指针的问题
  • 有关字符串指针和文件的问题(急!急!急!)
  • 关于指针的问题 在线等候 急急急!
  • DLL调用过程中的指针问题!急!急!急!
  • 指针数组成员的访问问题.急急急~~~!!!
  • 急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急
  • 急急急急急急急急急急~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!
  • 急急急急急急急急急急!
  • 急急急急急急急急急急!!!!!!!
  • 急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!

关键词

  • 函数
  • 指针
  • null
  • 结构
  • 文件
  • tagmydata
  • 急急
  • 变量
  • 越界
  • 分配

得分解答快速导航

  • 帖主:Juchiyufei
  • xlt123
  • oyljerry
  • huanyun
  • jiangsheng
  • holyeagle
  • xlt123

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo