2

プログラムをリリースモードで実行しようとすると、まっすぐになります

FPS Game.exe の 0x6f2426ef (msvcr100.dll) で未処理の例外: 0xC0000005: アクセス違反書き込み場所 0x12817c19。

これは、325 行目の onxit.c の static _onexit_t __cdecl _dllonexit_nolock 関数にあります。 *((*pend)++) = (_PVFV)func;

そして、なぜ私が多くのことを試したのかわかりません。うまくいきません。それが理由である場合、アプリケーションにsdlがリンクされていますが、これについて本当に助けが必要です。

これは、microsofts で問題が発生しているコードです。

static _onexit_t __cdecl _dllonexit_nolock (
        _onexit_t func,
        _PVFV ** pbegin,
        _PVFV ** pend
        )
{
        _PVFV   *p=NULL;
        size_t oldsize;

        /*
         * First, make sure the table has room for a new entry
         */
        if ( (oldsize = _msize_crt(*pbegin)) <= (size_t)((char *)(*pend) -
            (char *)(*pbegin)) )
        {
            /*
             * not enough room, try to grow the table
             */
            size_t grow=__min(oldsize, MAXINCR * sizeof(_PVFV));
            if((_HEAP_MAXREQ-grow<oldsize) ||
                ((p = (_PVFV *)_realloc_crt((*pbegin), oldsize + grow)) == NULL))
            {
                /*
                 * failed, try to grow by ONEXITTBLINCR
                 */
                grow=MININCR * sizeof(_PVFV);
                if ( (_HEAP_MAXREQ-grow<oldsize) ||
                    ((p = (_PVFV *)_realloc_crt((*pbegin), oldsize + grow)) == NULL ))
                {
                    /*
                     * failed again. don't do anything rash, just fail
                     */
                    return NULL;
                }
            }

            /*
             * update (*pend) and (*pbegin)
             */
            (*pend) = p + ((*pend) - (*pbegin));
            (*pbegin) = p;
        }

        /*
         * Put the new entry into the table and update the end-of-table
         * pointer.
         */
         *((*pend)++) = (_PVFV)func;

        return func;

}
4

1 に答える 1

1

長年の経験と多くの同様の経験に基づいて、私の経験則の1つは、「いいえ、コンパイラにバグを見つけただけではありません」です。

まず、デバッグ情報を使用してリリースをビルドします。これにより、少なくともスタックが表示され、何が問題になっているのかがわかります。

多くの場合、この種の問題は次の原因で発生します

  • 間違ったリンカー設定またはライブラリを使用している(これはMSVC / Windowsに固有です)
  • 同じコード生成オプションで構築されていないリリースライブラリとのリンク。
  • 変数を正しく初期化していない(デバッグモードでは表示されないことが多い)
  • すべてのプロジェクトで一貫したコンパイルオプションがない
于 2012-09-04T18:48:35.113 に答える