win7 + vc7.1 + mfc = stackoverflow - PullRequest
       9

win7 + vc7.1 + mfc = stackoverflow

0 голосов
/ 23 апреля 2010

Я переместил свой проект vc7.1 из WInXP в Win7. После перестройки я получил ошибку стека переполнения в функции _malloc_dbg при запуске программы.

"Unhandled exception at 0x0051bf0f in XXX.exe: 0xC00000FD: Stack overflow."

----------------------
Call stack:
> msvcr71d.dll!_malloc_dbg(unsigned int nSize=140, int nBlockUse=2, const char * szFileName=0x10267784, int nLine=163)

  msvcr71d.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=140, int nBlockUse=2, const char * szFileName=0x10267784, int nLine=163)

  msvcr71d.dll!_mtinit()

  msvcr71d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=1, void * lpreserved=0x0018fd24)

----------------------

Я пытался установить разные размеры стеков в опциях проекта (от 10 до 100 мегабайт), во всех случаях я получал эту ошибку.

Как я могу это исправить?

1 Ответ

1 голос
/ 23 апреля 2010

Предупреждения, такие как «преобразование из« int »в« void »большего размера» и «преобразование из« size_t »в« int », возможная потеря данных» почти наверняка означают, что вы случайно компилируете свое приложение как64-битный.Они пытаются сказать, что размер int (обычно 32 бита) и size_t или void различаются.В 32-битной компиляции size_t обычно будет того же размера, что и int, а в 64-битной - 64-битной.То же самое относится и к типам указателей, таким как void *.

. Сначала я бы дважды проверил, действительно ли ваше приложение работает в 32-битном режиме.Есть ли что-то вроде unix-файла «file», который вы можете запустить, чтобы проверить формат исполняемого файла?

После проверки я могу подумать о двух возможных причинах переполнения стека: так как код, который вы показываете, находится в malloc, возможно, у вас естьошибка скрытой памяти кучи, которая теперь появляется в новой среде.Если он разрушает часть стека, он может выглядеть как переполненный.

С другой стороны, вы можете непреднамеренно бесконечно возвращаться (опять же, возможно, из-за незначительного изменения в среде сборки) и фактически израсходовать весь свой стек.Бесконечная рекурсия может занимать достаточно много места в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...