最初にいくつか紹介します。現在、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 にコピーすることを意味します。
このエラーは、さまざまなコンパイラ オプションを使用した場合にのみ発生します。まったく同じプロジェクトでのパックとアンパックは正常に機能します。
何もわからないので、誰かが私を助けてくれることを本当に願っています。
よろしく