最近在編寫一個有關於圖像處理的簡單程序,但是居然碰見了下面的怪問題.
我封裝了一個CDib類來完成對Bitmap的讀取(我給她單獨建立了一個DLL文件),並且解析Bitmap文件,就是分別找出File Header,Info Header等等,由於需要分配比較多的內存,所以我還在類中建立了一個Heap,來進行管理內存分配,那麼這個文件編譯連接都已經通過.
但是我連接到主程序使用的時候,問題就來了,我使用這個類來讀取文件的時候,就出現了非法訪問內存空間的問題,原來我還以為是DLL文件的問題,但是跟蹤發現,類中的Read函數正常運行,並沒出現甚麼非法訪問的問題,但是我在主程序中就出現了,如下
CDib dib;
TCHAR tchPath[]="tt.bmp";
BOOL aa=dib.Read(tchPath);  //錯在這兒,這兒居然出現了非法訪問內存的錯誤.於是我又返回到DLL文件的CDib類中,在Read函數的最後一句話return TRUE之前,檢測程序是否能正常運行,結果是在這個語句之前,沒出現甚麼問題,但是一旦返回值,就出現了非法訪問的錯誤,我使用SoftICE跟蹤過,語句如下
mov edi,[ebx]  //錯在這兒了,非法訪問的地址來自於DLL地址空間
但是為甚麼,我在return TRUE這個語句之前就沒出現問題,偏偏執行到return TRUE的時候出現問題呢.
但是,我現在想不通怎麼一返回值就出錯,沒返回的時候不出錯呢.
希望高手大力指教,謝謝先.

解决方案 »

  1.   

    差點忘記了,在主程序中,我建立了一個Thread,在ThreadProc中使用了這個類.
    不知道這有沒影響.
      

  2.   

    沒亞,
    因為Read函數只是CDib類中的一個成員函數而已,沒甚麼需要釋放的內存,除了分配在Heap中的內存空間.
      

  3.   

    TCHAR tchPath[]="tt.bmp";我觉得问题出在这.你的Read参数申明的是char*还是LPCTSTR的?会不会传到里面去后,找不到字符串的结束位了.
      

  4.   

    我觉得最有可能是你的CDib中的某些代码破坏了堆栈,因为你说你自己分配了一个堆来管理内存分配,管理内存很容易出错的;堆栈别破坏的时候,往往(还是只有,望高手指点)在函数返回才出现错误。
      

  5.   

    申明的是LPTSTR,而且在Read函數裡面對參數的檢測很仔細.
    問題是整個函數沒出現執行錯誤,居然錯在最後一句,
    return TRUE
    因為上面的返回語句執行完畢之後,就是下面的語句了.
    BOOL aa=dib.Read(tchPath);  //錯在這兒,這兒居然出現了非法訪問內存的錯誤.
      

  6.   

    edyang(化石)
    我覺得你說的比較擊中要害,我仔細看看.
      

  7.   

    记得有人说过不要跨Module申请和释放内存.
    我试过了静态调用就可以.动态跨Module的就不行(估计和地址空间映射有关)
      

  8.   

    应该就是堆栈的问题,试试在VC调试的时候打开View->Debug Window->Disassembly窗口看一看函数进入和return时的堆栈内容