Почему MIcroQuill Smartheap выдает ошибки «mem_bad_pointer» после того, как я вставил perl? - PullRequest
1 голос
/ 30 января 2009

Я встраиваю Perl в приложение C ++, которое использует Smartheap . Независимо от того, собираю ли я perl для использования его собственного malloc или системы, я получаю кучу диалогов об ошибках mem___bad_pointer. Кажется, это работает нормально, когда я просто нажимаю «ОК» и игнорирую ошибки, но, очевидно, мне нужно решить проблему.

Возможно, мне нужно скомпилировать SmartHeap в мою сборку perl? Это вообще возможно?

Ниже единственная документация страница о mem__bad_pointer's, которую я смог найти, но я не приблизился к решению проблемы. Я не понимаю, как и где Perl и Smartheap конфликтуют друг с другом. Любые указатели оценены.

  • Указатель был выделен диспетчером памяти, отличным от SmartHeap, например, из другой DLL или EXE или из библиотеки времени выполнения компилятора. Изучите файл своей карты, чтобы увидеть, что версия malloc, _fmalloc / farmalloc или оператора new SmartHeap связана в.
  • Указатель является «диким» (неинициализированным), размещается в стеке (локальная переменная) или недопустим.
  • Указатель был ранее освобожден. Если SmartHeap освободил страницу, с которой первоначально был выделен указатель, SmartHeap не сможет обнаружить, что это двойное освобождение. Однако SmartHeap сообщит о неверном указателе. Используйте dbgMemDeferFreeing, чтобы поймать этот тип ошибки.
  • Указатель увеличивался или уменьшался с момента выделения.
  • Для 16-битного x86 указатель был приведен к ближнему указателю после выделения, и в этом случае сегментная часть указателя была потеряна.
  • Пул памяти, из которого был выделен указатель, был освобожден или SmartHeap был незарегистрирован в задаче.
  • Задача, из которой был выделен указатель, завершена (см. Раздел B.4).

1 Ответ

1 голос
/ 13 февраля 2009

Не видя код, трудно отладить проблему. Возможно, вы выделяете память, используя как smartheap, так и обычный менеджер памяти. это может быть вызвано выделением памяти в сборке dll без интеллектуальной кучи.

В зависимости от вашего кода, распределение может быть правильным, и вы можете писать вне области памяти с покрытием.

...