ntdll.dll!76f3f367()
ntdll.dll!76f78aa6()
B.dll!operator new(unsigned int size=1985048172)行59+0x9字节ntdll.dll!76f75b87()
ntdll.dll!76f78752()
A.dll!_heap_alloc_base(unsigned int size=108)行105+0x28字节
A.dll!_heap_alloc_dbg(unsigned int size=72,int nBlockUse=1 .........
A.dll!_nh_malloc_dbg(unsigned int size=72,int nhFlag=0 .........
A.dll!malloc(unsigned int size=72) ......上面是函数调用堆栈的内容,程序的结果当然是崩溃了不过,搞不明白的是,模块A在调用malloc的时候,是怎么扯到模块B上去的呢,并且B里面又new了那么打空间?

解决方案 »

  1.   

    上面的跑行了
    ntdll.dll!76f3f367() 
    ntdll.dll!76f78aa6() 
    B.dll!operator new(unsigned int size=1985048172)行59+0x9字节ntdll.dll!76f75b87() 
    ntdll.dll!76f78752() 
    A.dll!_heap_alloc_base(unsigned int size=108)行105+0x28字节 
    A.dll!_heap_alloc_dbg(unsigned int size=72,int nBlockUse=1 ......... 
    A.dll!_nh_malloc_dbg(unsigned int size=72,int nhFlag=0 ......... 
    A.dll!malloc(unsigned int size=72) ...... 
      

  2.   

    靠,又跑行了
    ntdll.dll!76f3f367() 
    ntdll.dll!76f78aa6() 
    B.dll!operator new(unsigned int size=1985048172)行59+0x9字节
    ntdll.dll!76f75b87() 
    ntdll.dll!76f78752() 
    A.dll!_heap_alloc_base(unsigned int size=108)行105+0x28字节 
    A.dll!_heap_alloc_dbg(unsigned int size=72,int nBlockUse=1 ......... 
    A.dll!_nh_malloc_dbg(unsigned int size=72,int nhFlag=0 ......... 
    A.dll!malloc(unsigned int size=72) ...... 
      

  3.   

    两个dll都rebuild一下试试,现在堆栈都出错了
      

  4.   

    整个SOLUTION都重新Rebuild过了
    就是不行啊实在是搞不明白,malloc怎么还能出错呢?并且是扯到别的上面去了
      

  5.   

    to 楼上的
    现在是没办法看
    目前是有一个类
    我把它的new 给重载了
    自己用malloc分配内存现在
    NEW这个类,进到malloc里面,就这样了
    根本类的空间都没分配出来,更不用说调用构造函数了
      

  6.   

    类的空间是否要求很大...
    B.dll是否被A调用到
      

  7.   

    那个类我都算过了,就是72个字节(被折磨的没办法了,做这种无聊的事)况且malloc确实传的72个
    但等不到它返回就完蛋了
    中间我什么都没干啊另说一句,我就是在这个类里面新加了一个成员变量 int 的,
    还没使用呢,就这样了,把这个变量干掉就没事
      

  8.   

    很常见的bug 很多方法可以搞定.
      

  9.   

    TO 17楼
    可我全都CLEAR掉
    重新REBUILD的了
    应该不会有问题啊
      

  10.   

    2个G代码? 你在搞笑. 对应的dll头文件及使用出问题类的调用代码.
      

  11.   

    我觉得奇怪的是,系统 API 回调 B.dll 了,
    在代码里确认一下,有没有做这个事情,
    如果没有,可以估计运行栈坏了,
      如果是运行栈坏了,在Debug下没有报错(我是只破坏栈的时候),你用的是不是 VC6 编译的,
      如果是,看看能不能用 VS2003 或者以上版本编译调试(vs2003以上的),因为这些版本有运行栈的检测的,运行栈一坏,马上就提示,
      

  12.   

    全部的solution真的是这么大
    简而言之:
    U模块定义了基类u并导出(重载了new,delete,自己用malloc 和free分配内存)
    X,Y,Z模块派生出子类x,y,z,也导出然后,M模块中,分贝new 出x,y,z;
    在new y 的过程中,就出现了上面的问题new y的时候,调用malloc(72),是没问题的,y确实72个字节
    但malloc返回之前,就出问题了这些代码是很难提出来的
      

  13.   


    然后,M模块中,分贝new 出x,y,z; 
    在new y 的过程中,就出现了上面的问题把这段代码发出来. 最好能把U模块重载 new,delete的代码也发下.
      

  14.   

    有代码很好查的. 你看看B.dll的那个new是谁调用压入1985048172这个参数的. 你这个用了vld没?
      

  15.   

    U模块重载 new,delete的代码:
    void* U:: operator new(size_t size){return malloc(size);}
    void U:: operator delete(void *p){free(p);}new的代码 (类似吧)U* pU[3];
    for (int i = 0; i< 3; i++){
       switch (i)
          case 0:
          pU[i] = new X;       break;
           case 1:
          pU[i] = new Y;       break;......}
      

  16.   

    另外,我根本就不知道在B.dll中那个new 是什么后调用的
    也不应该调用到它,因为malloc还没返回呢B.dll中有很多new,
    调用堆栈上也看不出来是在那里调用的
      

  17.   


    系统 API 回调 B.dll应该是不可能的,因为malloc还没返回呢
    另外,我用的是2005,不是6.0
      

  18.   

    你这是把简单的事情复杂化了.
    void* U:: operator new(size_t size){return malloc(size);} 
    void U:: operator delete(void *p){free(p);} 你的new和delete根本不是标准的写法. 更何况这里这2个函数完全不需要.如果你不把M模块调用部分 U模块头文件的 真实代码发上来. 帮不了你.另: 你rebuild 对应的头文件有copy过去吗? 还是工程设置好的. 这个你要搞清楚.
      

  19.   

    你上面发的的A.dll,B.dll 分别是哪个模块? Y U ?
      

  20.   

    头文件只有一个,是不需要拷贝到其他的模块去的
    B.dll 是一个与X,Y,Z类似的导出类标示用了:__declspec(dllexport)