公司的一个产品中有一个ole容器,可以插入自己开发或是第三方的ocx控件,并且用一个属性页来显示控件属性和方法,属性和方法各为一页,现在发现有一个第三方控件,在多次切换属性和方法属性页时,会使主程序crash,察看dr watson的log发现是内存分配问题,后来发现错误之处在这样一个语句a = new b,这行语句是在循环enumerate控件属性中,主要是先new出一个a对象,取出一个属性把属性名称和值之类的相关元素放到a中,然后把a加到指针数组中,出问题的情况下是新new出来的指针居然跟前面new出来某个指针是一个地址,这显然是不可能的事情,循环还没有完成,也没有释放之前那个指针的内存,出现相同指针之后下次再new就是主程序crash。这段去方法和属性的code肯定没有问题,至今为止也只发现这一个控件有这个问题,而且在debug版本的主程序中会出现'Out of memory'问题。请问一下什么情况下会出现这种内存问题,我的机器内存是1G的,磁盘空间也还有几个G没有用?先谢了

解决方案 »

  1.   

    原因可能是因为你的循环代码被重入了,比如在enumerate循环中调用某个函数,该函数内也会进入enumerate循环,于是外面删除里面分配就造成了问题。检查的方法是在你的函数里设置一个全部变量标志,看看是否有重入。
      

  2.   

    没有重入的,用OutputDebugString加了信息,循环过程中没有看到再次进入标志。怀疑是这个控件有问题,因为其他控件都用得好好的,但是没有这个控件的源代码。但是不知道为什么会出现此类问题。
      

  3.   

    什么叫堆栈没开够阿,直接new的一个类,这个类用来保存所有的信息