Critical error detected c0000374

Я столкнулся с ошибкой памяти при попытке освободить пользовательскую DLL. Если вы не хотите знать причину этой проблемы, я рекомендую вам прочитать мою проблему в начале раздела 2. пользовательская DLL.

В моей программе мне нужно использовать стороннюю библиотеку. В следующей части я называю это LIB-A / DLL-A . Абстрактный процесс этой библиотеки может быть описан с использованием 4 функций:

Используется LIB-A передал ice34d.dll , а также iceutil34d.dll , Добавляя lib и включенные файлы в мой проект (Я называю эту программу exe-A ), Я обнаружил, что эти функции могут хорошо работать.

Но теперь я должен использовать другой метод сослаться на DLL-A , Другими словами, я должен использовать LoadLibrary , GetProcAddress а также FreeLibrary завершить эту задачу. Поскольку я обнаружил, что DLL-A не предоставляет какой-либо доступный интерфейс вышеуказанных функций, я пытаюсь удалить DLL-A из папки, содержащей exe-A , Результат показывает, что DLL-A не является допустимым файлом, exe-A может хорошо работать без него.

Поскольку DLL-A неверно, я должен написать пользовательскую DLL, чтобы обернуть вышеупомянутые 4 функции, Я называю эту программу DLL-B . DLL-B был связан с такими библиотекарями:

Хотя DLL-A является недействительным, LIB-A необходимо, потому что я предполагаю, что вышеупомянутые 4 фонда не только объявлены, но также определены в LIB-A , а также DLL-A на самом деле пусто. После настройки libs и включенных файлов я пишу 4 функции упаковки. Вот основная часть файлов .h и .cpp.

.h файл: (некоторые параметры опущены)

Ведь я начинаю писать тестовую программу (Я называю это exe-B ). В этой программе я использую такие коды для загрузки DLL-B :

Это сбивает с толку, что даже программа может быть скомпилирована хорошо, GetLastError () возвращает 0, и все 4 основания работают хорошо. Однако, как только я позволю программе освободить экземпляр DLL, я получу такую ​​ошибку:

Если я не освобождаю библиотеку, в этой программе не будет ошибок.

Чтобы доказать свою догадку, я провел еще 2 эксперимента:

Я пишу DLL ( DLL-C ) обернуть другую библиотеку ( LIB-D ) разработан мной. И я загружаю DLL-C похожим методом в разделе. Проблема. Результат показывает, что DLL-C может быть освобожден без ошибок. Единственная разница между DLL-C и DLL-B заключается в том, что DLL-B загружает сторонние библиотеки ( ice , LIB-A ) и DLL-C загружают простую библиотеку ( LIB-D ) разработан мной. Кажется, что эта ошибка вызвана сторонними библиотекарями. К сожалению, я не мог видеть детали этих внешних библиотек.

Я изменяю файл .cpp следующим образом:

Ужасно, что хотя я ничего не делаю с загруженным DLL-B , как только я загрузил это, я не мог освободить это безопасно. Ошибка такая же, как и выше, ошибка в разделе. Проблема.

Как я мог решить эту проблему? Значит ли это, что я не смог освободить библиотеку, а использовал ее нормально?

Возникла проблема при инициализации динамического массива

Проблема возникает в строках:

Изза того что n не равна конкретному числу. Как исправить? Вроде нарушений доступа и синтаксиса нет. И почему данная проблема возникла?

2 ответа 2

Достаточно часто мне на SO попадается код вроде этого:

Почему-то новичкам кажется, что new int[n] магическим образом связывает n с размером массива, так что потом, меняя n , можно растягивать и сжимать массив. Это не так. После вызова new int[n] размер массива остается фиксированным.

Так что нужно сначала получить n , а только потом делать new .

Решение: int* arr = new int[n]; заменить на просто int *arr; , а после cin >> n; поставить arr = new int[n]; .

Кроме того, обратите внимание: Из вашего класса как из решета течет память! В деструкторе не хватает delete [] , а также недостает копирующего конструктора и оператора присваивания.

Советую почитать: правило трех (the rule of three).

I have a c++ dll which serving some functionality to my main c# application. Here i try to read a file, load it to memory and then return some information such as the Pointer to loaded data and count of memory blocks to c#. The Dll reads file to memory successfully but on the return to the main application, program crashes due to Heap Corruption(Critical error detected c0000374).

The code is quite simple and straightforward and I have done some similar things before with no problem, However i could not figure out what makes the problem here, I tried to allocate memory using "new, malloc and GlobalAlloc" but neither did help. Codes are as follow:

The program crashes on both debug and release mode. Unless I pause the program in debug mode after loading the file and call some blocks of memory in the "Visual Studio’s Immediate window". The size of files to be loaded are around 64MB and we have more than 2GB unused ram on the PC.

UPDATE: I noticed that, some third party programs which they working before, crash with "Exception Code: c0000005", and some other weird things happens in Windows 7 (the Host). so I tested the code in another installation of windows and everything seems to work as they should. So probably it’s related be the Windows 7. Now how could I fix the problem? "sfc /scannow" failed to find any issue.

Оцените статью
Много толка
Добавить комментарий