처음에는 몇 가지 소개가 있습니다. 현재 서로 다른 컴파일러 옵션을 사용하여 프로젝트를 실행할 수 있다는 것을 의미하는 C++ 호환성 문제에 대해 작업하고 있습니다. 따라서 릴리스 DLL과 다른 프로젝트에 링크 된 디버그 응용 프로그램으로 테스트합니다. STL을 사용할 때 대부분의 문제가 발생하므로 두 프로젝트 모두 자신의 STL 버전 만 사용하도록해야합니다. Thatswhy std :: vectors, std :: lists 등을 빌드 할 수있는 래퍼 클래스가 있지만 완전히 호환되는 배열 만 포함하고 있습니다. 이제 배열의 값을 래핑하고 다른 쪽을 유효한 STL 객체로 압축을 풀 수 있습니다.벡터 인덱서에서 이상한 액세스 위반
이제 질문에 좀 더 가까이 다가 가십시오. STL을 포함하는 일부 클래스가 있지만 배열로 래핑 될 필요가 있습니다. 그래서 태그을 추가하고 연관된 배열 요소 바로 옆에 저장하는 것을 의미하는 내부 STL 객체를 래핑해야합니다. 이 래퍼 클래스를 구축
는전혀 문제가 없지만 풀고 그것은 바로 여기 벡터 클래스의 액세스 위반으로 충돌 :
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;
};
:
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
}
그 순간에서의 실행 코드는 이것이다
궁금한 점은 std :: list를 풀고 있지만 std :: vector에서 충돌하는 것입니다. 내가보기에 std :: vector에 포함 된 클래스가 있는데이 클래스는 STL이없는 기본 클래스의 std :: list를 포함합니다. 따라서 언 패킹은 외부 배열을 std :: vector로 복사하고 모든 내부 배열을 std :: list로 복사하는 것을 의미합니다.
이 오류는 다른 컴파일러 옵션을 사용할 때만 발생합니다. 동일한 프로젝트에서 패킹을 압축하면 잘됩니다.
나는 누군가가 내가 어떤 생각을 갖지 못하게 도와 줄 수 있기를 정말로 바란다.
감사
당신이 정말로 STL의 두 가지 버전이 필요하십니까
같은 옵션으로 컴파일하지 않으면이 문제를 해결할 방법이 없다고 생각합니다. 참조하십시오 : http://stackoverflow.com/questions/4446620/returning-strings-from-dll-functions – Maxpm
당신이 알아야 할 몇 가지 사항이 있지만 내 코드를 약간 변경 한 후에이 코드로 컴파일 할 수있었습니다. 방법. 그러나 내부 STL 객체가없는 예제에서 개념이 작동하면 문제가 전혀 보이지 않는 간단한 '재귀 배치'에서 충돌이 발생하기 시작합니다. –
@Marcel 왜 다른 포장 옵션과 호환되는 배열을 고려하십니까? 보통 그들은 – user396672