// ctable.dll
CTable* _pct;  // 在 dll 文件为全局变量void New()
{
    _pct = new CTable;
}void Del()
{
    if (_pct) delete _pct;
}...// 在一个 MFC 程序中, 先调用 New 函数为 _pct 分配内存,这个正确,也可正常使用,在最后调用
// Del 函数时,会弹出个对话框显示:
user.exe 中的 0x77f813b1 处未处理的异常: 用户断点 。
// 这是调试栏中输出的内容:
user.exe 中的 0x77fcca14 处最可能的异常: 0xC0000005: 写入位置 0xfeeefeee 时发生访问冲突 。
// CTable 对象在一个“控制台”程序中用 new 和 delete 进行测试,没有出现任何问题。
// 为什么会这样,应该怎么解决?// 直接运行生成的 .exe 文件没有问题,可以正常使用。// 编译器: vc7.1
// 系统  : Win2kpro
// CPU   : C1.7
// 内存  : 256M

解决方案 »

  1.   

    外面申请的就外面释放,不用DLL的函数,统一起来!
      

  2.   

    回复人:laiyiling(Technology Laboratory) ( 两星(中级)) 信誉:464  2005-10-04 14:37:00  得分:0

    外面申请的就外面释放,不用DLL的函数,统一起来!--------------------------------
    如何做?
      

  3.   

    不可以在 dll 文件中定义全局指针变量吗?
      

  4.   

    CTable* _pct = NULL;
    主程序没有修改_pct的地方?
      

  5.   

    回复人:Mackz(在相互) ( 两星(中级)) 信誉:104  2005-10-04 16:41:00  得分:0

    CTable* _pct = NULL;
    主程序没有修改_pct的地方?
    ---------------------------------------
    没有啦,其的函数只是 _pct-> ... 的操作!
      

  6.   

    主程序 不对 _pct 进行直接操作。
      

  7.   

    应该是被重复释放了, 释放前最好判断一下空指针.
    CTable* _pct = NULL;  // 在 dll 文件为全局变量void New()
    {
        _pct = new CTable;
    }void Del()
    {
        if (_pct) 
        {
              delete _pct;
              _pct = NULL;
        }
    }
      

  8.   

    还有在New之前如果已经存在_pct, 需要先Delete _pct, 否则会有内存泄漏, 所以
    void New()
    {
       if(_pct)
         delete _pct;
       _pct = new CTable;
    }
      

  9.   

    关键是你在delete后是否有其他的地方还在使用_pct。
    最好在调Del的地方设个断点,一步步跟进去看看,到底是哪里出错。
      

  10.   

    谢谢大家! 问题已经解决了!是 CTable 类中的 Save 函数中的 写文件错误!里面的 filename = NULL 了。改过以后就没有问题了,不明白为什么会这样,我记得没有调用 Save ,真是的。不过还是谢谢各位。