1

最初にいくつか紹介します。現在、C++ との互換性に取り組んでいます。これは、異なるコンパイラ オプションを使用してプロジェクトを相互に実行できるようにすることを意味します。したがって、リリース DLL と、その他のプロジェクトにリンクするデバッグ アプリケーションでテストします。問題のほとんどは STL を使用するときに発生するため、両方のプロジェクトが独自のバージョンの STL のみを使用するようにする必要があります。そのため、std::vectors、std::lists などから構築できるが、完全に互換性のある配列のみを含むラッパー クラスがあります。これで、値を配列にラップし、反対側でそれらを有効な STL オブジェクトにアンパックできます。

質問にもう少し近づくために、STL を含むが配列にラップする必要があるクラスがいくつかあります。そのため、内側の STL オブジェクトもラップする必要があります。つまり、タグを追加して、関連する配列要素のすぐ隣に保存します。

このラッパー クラスを構築することはまったく問題ありませんが、展開すると、ここにあるベクター クラスでアクセス違反が発生してクラッシュします。

   const_reference operator[](size_type _Pos) const
        {   // subscript nonmutable sequence

 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());

        return (*(_Myfirst + _Pos));  <---- HERE
        }

その時点で実行中のコードは次のとおりです。

template<class T>
struct mwContainerItem
{
    T m_element;
    void * m_tag;
};

template<class T>
class mwContainer
{
    STLList ToList()
    {
        STLList l;
        for(size_t i=0; i<m_size; ++i) <---- It crashes when accessing m_size
        {
            l.push_back(m_elements[i].m_element); <---- It also crashes when accessing m_elements
        }
        return l;
    }

    mwContainerItem<T>* m_elements;
    size_t m_size;
};

それについての奇妙なことは、私は std::list を解凍していますが、std::vector でクラッシュします。std::vector に含まれるクラスがあり、このクラスには STL のないいくつかの基本クラスの std::list が含まれています。したがって、アンパックとは、外側の配列を std::vector にコピーし、すべての内側の配列を std::list にコピーすることを意味します。

このエラーは、さまざまなコンパイラ オプションを使用した場合にのみ発生します。まったく同じプロジェクトでのパックとアンパックは正常に機能します。

何もわからないので、誰かが私を助けてくれることを本当に願っています。

よろしく

4

1 に答える 1

1

2 つのバージョンの STL が本当に必要ですか? つまり、2 つのプロジェクトを 2 つの異なるコンパイラと 2 つの異なる STL 実装で構築しているということですか? デバッグ バージョンとリリース バージョンが混在している場合、通常、問題は 2 つの異なるヒープが原因で発生します。次に、あるモジュールで割り当てられたメモリを別のモジュールで解放しようとすると、エラーが発生します。これがあなたが直面しているケースである場合は、別のアプローチを試すことができます - 両方とも同じヒープを使用してください。

両方のプロジェクトを制御できる場合は、DLL からアロケータ (および対応するデアロケータ) をエクスポートして、EXE で使用できます。このように、メモリ管理は単一のヒープで行われ、ビルド タイプは問題になりません。演算子 new、ベクター/リスト アロケーターなどで使用できます。

これはおそらくパッキングの問題を解決しません (とにかくパッキング設定を変更するのは誰ですか?...) が、複数のヒープを使用する場合に必要なものです。

于 2011-07-05T10:36:06.787 に答える