- Debug Assertion Failed
- _BLOCK_TYPE_IS_VALID
- _CrtIsValidHeapPointer
主要是因為build Debug mode的DLL,STL會enable _SECURE_SEL 和 _HAS_ITERATOR_DEBUGGING,裡面會對memory多做一些checking,假如你在Release mode,new了一塊memory後放到Debug mode的STL container,在Debug mode裡試著去delete這塊memory時,會多做一些Release mode不會做的error checking,就會有不預期的exception出現。
想想,Release跟Debug所用的CRunTime library是不一樣的,同一塊memory讓不一樣的CRunTime處理,當然可能會出錯。
解決辦法:
- (不混用) 將全部的module統一build成Release or Debug mode
- (大統一) Memory allocated/free的行為,統一交給一個module處理
Sample Error Code :
//////////////////////////////////////////////////////// // A.dll - build in Release mode //////////////////////////////////////////////////////// B bMgr; void AppendIntArray(int* array, int size) { for(int i=0 ; i<size ; ++i) { // New memeory in A.dll (Release Mode) bMgr.m_int.push_back(new Value<int>(array[i])); } } void AppendFloatArray(float* array, int size) { for(int i=0 ; i<size ; ++i) { // New memeory in A.dll (Release Mode) bMgr.m_float.push_back(new Value<float>(array[i])); } } //////////////////////////////////////////////////////// // B.dll - build in Debug mode //////////////////////////////////////////////////////// template <typename T> class Value { public: Value(T _v){v=_v;} T v; } class B { public: void ClearAll(); vector< Value<int>* > m_int; vector< Value<float>* > m_float; } void B::ClearAll() { // Release memeory in B.dll (Debug Mode) for(int i=0 ; i<m_int.size() ; ++i) delete m_int[i]; m_int.clear(); // Release memeory in B.dll (Debug Mode) for(int i=0 ; i<m_float.size() ; ++i) delete m_float[i]; m_float.clear(); }
Reference
沒有留言:
張貼留言