在dll中new一块内存,然后用SendMessage将其地址发到一个窗体上面,在窗体接受了消息并处理完成以后用delete来删除这块内存,delete的时候就出错了。
dll:
    char* pCHar = new char[100];
......
::SendMessage(
hWnd, 
WM_USER + 1120, 
100, //size of the buffer;
(LONG)pCHar);in Dialog;
       GetBuffer(WPARAM wParam, LPARAM lParam){
          .....//处理数据;
          char*pChar = lParam;  
          delete pChar;//在这里出错了提示:user breakpoint called from code at 0x7c91230
          pChar = NULL;
}
这是怎么回事啊?谢谢了,

解决方案 »

  1.   

    Debug版本的客户程序释放Release版本DLL申请的内存时,会导致运行时错误。
    可以让DLL同时提供申请和释放内存的函数供客户程序调用
    DLL不能释放客户程序申请的内容
      

  2.   

    在dll中new一块内存,然后用SendMessage将其地址发到一个窗体上面,在窗体接受了消息并处理完成以后用delete来删除这块内存,delete的时候就出错了。----------------------------------------
    应该发指针的指针ppChar(=&pCHar),然后删除掉*ppChar,并置空*ppChar=NULL
      

  3.   

    让exe和dll使用一样的申请/销毁的函数例如使用API:VirtualAlloc,VirtualFree来代替new/delete
      

  4.   

    dll提供申请和释放的两个函数
      

  5.   

    应该可以吧?COM不就是在DLL中new了一个对象指针来用吗?
      

  6.   

    dll:
        char* pCHar = new char[100];
    ......
    ::SendMessage(
    hWnd, 
    WM_USER + 1120, 
    100, //size of the buffer;
    (LONG)pCHar);in Dialog;
           GetBuffer(WPARAM wParam, LPARAM lParam){
              .....//处理数据;
              char*pChar = lParam;  
              delete pChar;//在这里出错了提示:user breakpoint called from code at 0x7c91230
              pChar = NULL;
    }你的程序不需要这么写的吧?
    dll:
        string text;
        .....
        SendMessage(..., (LPARAM) text.c_str());in Dialog
        GetBuffer(...)
        这里不需要对哪个指针的删除你调用SendMessage 就如同call GetBuffer差不多,如果在一个线程里
    如果不在的话,那就是用sendmessagenotify or postmessage.... 那就加一个thread safe的queue,然后在你的getbuffer将处理过的数据从queue删除掉你非要这样的话,按照 oyljerry(【勇敢的心】→ ㊣Winterize√㊣) 所说的做
    dll提供申请和释放的两个函数
      

  7.   

    微软规定:dll里面申请的内存只能由该dll来释放的解决的方法:你可以在dll里面提供一个内存的接口,让外部调用它来释放
      

  8.   

    D L L函数分配的内存块是由E X E的函数释放的吗?答案是可能的。上面显示的代码并没有为你提供足够的信息。如果E X E和D L L都链接到相同D L L的C / C + +运行期库,那么上面的代码将能够很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,或者连接到了不同的C / C + +运行期库,那么对free函数的调用就会失败。我经常看到编程人员编写这样的代码,结果都失败了。