Здравствуйте.
Сидел прогил тихо мирно... на 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