4

本当に奇妙なバグに遭遇しました。誰かが説明してくれることを願っています。は単純なstd::vector<V3x>で、V3xは 3 次元ベクトル (線形代数のようなもの) です。次のコードにより、std::length_error例外がスローされます。

std::vector<V3x> vertices;
int vertexCount = computeVertexCount();
vertices.resize(vertexCount); // throws std::length_error

computeVertexCount()が の値を返すことを確認しましたが35、これははるかに低いvector::max_size()ため、大量のメモリを要求している可能性はありません。

例外を の定義std::vectorから次の 2 つの関数までたどりました。

void resize(size_type _Newsize, _Ty _Val)
    {   // determine new length, padding with _Val elements as needed
    if (size() < _Newsize)
        // NOTE: here, _Newsize - size() = 35
        _Insert_n(end(), _Newsize - size(), _Val); 
    else if (_Newsize < size())
        erase(begin() + _Newsize, end());
    }

void _Insert_n(const_iterator _Where,
    size_type _Count, const _Ty& _Val)
    {   // insert _Count * _Val at _Where
        // NOTE: here, _Count = 3435973836
        ...
    }

そのため、_Countパラメータが と の間で渡されるresize()_Insert_n()、値が 35 から 3435973836 に変更されます。メモリが何らかの形で破損したと想定していますが、それがどのように発生するかはわかりません。

問題の一部である場合に備えて、このコードは、Softimage XSI からロードしている .dll プラグインに含まれています。

このようなことが起こる原因を知っている人はいますか?

編集:解決策

nobugz、私はあなたにキスすることができました。

VS2008のため、.dll 内で std::vector のサイズが変化してい_HAS_ITERATOR_DEBUGGINGました。検索により、同じ問題を抱えている人が見つかり、プロジェクトの上部に次を追加することで修正されました。

// fix stack corruption errors caused by VS2008
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
4

5 に答える 5

22

値 3435973836 は重要です。16 進数では 0xcccccccc です。これは、スタック フレームの初期化コードによってデバッグ モードでローカル変数に割り当てられる値です。デバッグ中に戻ってきたら、「ああ、変数が初期化されていません」と言うでしょう。たぶん、これで解決に少し近づきます。

あなたはDLLに言及しています。それも関係あります。イテレータのデバッグは問題を引き起こす可能性があります。オフになっているコードとそうでないコードを混在させることはできません。DLL はおそらくそれなしでコンパイルされるため、#define _HAS_ITERATOR_DEBUGGING 0 を試してください。

于 2009-01-11T18:43:54.530 に答える
2

パラメーターまたはローカル変数が予期せず変更される場合は常に、スタックの破損が原因である可能性が高くなります。これは、初期化されていないローカル変数を使用するか、ローカル文字列または配列に割り当てられたメモリを超えてデータを格納するたびに発生する可能性があります。

これをデバッグする簡単な方法:

  1. プログラムをデバッガーにロードします。
  2. 問題のある関数のコードの最初の行にブレークポイントを挿入します。
  3. ブレークポイントに到達するまでプログラムを実行します。
  4. 予期せず変化する変数を監視します。
  5. 予期しない変更が発生するまで関数をステップ実行します。

割り当てられていない (または誤って割り当てられた) メモリが書き込まれると、変更が発生します。書き込みのターゲットは問題のある変数です。

于 2009-01-11T18:26:34.393 に答える
0

関連するプロジェクト用に構成された C++ オプションを確認することをお勧めします。それらがすべて同じアライメントとランタイム設定を共有していることを確認してください。関連する .DLL をビルドしていますか?

于 2009-01-11T18:25:34.083 に答える
0

世界(すべて)を再コンパイルすると役立つ場合があります...

于 2009-01-11T19:46:29.317 に答える