Ошибка пр удалении массива
От: uzzy Россия  
Дата: 09.05.03 15:25
Оценка:
Здравствуйте.
Сидел прогил тихо мирно... на MSVC 6.0 и бум прикол на голову (следует сначала бегло все прочесть, а потом повторно еще раз... так как изложение мыслей будет возможно непоследовтельным
В общем проблема в следующем:

имеется некий core.h файл с своей core.cpp, из которых в результате манимуляций создаются core.dll и core.lib

core.h

...
template<TYPE> int new2dArr (int h, int w, TYPE**& ppArr)
{
   ppArr = new int*[h];
   for (int i = 0; i < h; i++)
      ppArr[i] = new int[w];
}

void __declspec(dllexport) delete2darr (int h, void**& ppBuf);
...



core.cpp

void delete2darr (int h, void**& ppBuf)
{
   for (int i = 0; i < h; i++)
      delete[] ppBuf[i];
   delete[] ppBuf;
   ppBuf = NULL; // вот здесь вываливается ошибка
}



вооот ... потом создал модуль io, в котором считывается некий файл, инициализируются две матрицы при помощи new2dArr примерно так :
io.cpp

#include "core.h"
...
int** ppM1 = NULL;
int** ppM2 = NULL;
int   res;
...
res = new2dArr (h1, w1, ppM1);
res = new2dArr (h1, w1, ppM2);
...
// после инициализации, и дальнейшей манипуляции с матрицами ppM2 удалется:
delete2dArr (h1, ppM2); // вот здесь вываливается ошибка
/* манипуляции следующего рода 
ppM1[i][j]++; 
ppM1[i][j]+=a; 
и прочее, то есть не было никаких изменений самих указателей.
*/


модуль io создает io.dll. В некотором файле tex.exe есть следующее: Функции io подгружаются через LoadLibrary + GetProcAddress. Функии core берутся из core.lib. Похоже на извращение, но это такой тест проги и библиотеки... который они не проходят. В общем ошибка такая:
В результате работы test.exe грузится io.dll (удачно), берется адрес некоторой функции load из этой библиотеки (часть кода этой функции представлено в примере io.cpp)... во время исполнения вываливается ошибка там показано в коде.
Более глубокий дебаг показал... что ошибка возникает в ntdll... в результате изучения ошибки наткнулся на ихний комментарий:
_CRTIMP void __cdecl _free_dbg(

#endif  /* _MT */

        void * pUserData,
        int nBlockUse
        )
        ...
        /*
         * If this ASSERT fails, a bad pointer has been passed in. It may be
         * totally bogus, or it may have been allocated from another heap.
         * The pointer MUST come from the 'local' heap.
         */
        _ASSERTE(_CrtIsValidHeapPointer(pUserData));
        ...


Причем данная ошибка возникает при DEBUG линковки... при RELEASE-е все пучком...
можно ли избавиться от подобной ошибки если даже и работает при RELEASE
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.