2011-07-05 1 views
1

처음에는 몇 가지 소개가 있습니다. 현재 서로 다른 컴파일러 옵션을 사용하여 프로젝트를 실행할 수 있다는 것을 의미하는 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의 두 가지 버전이 필요하십니까
+0

같은 옵션으로 컴파일하지 않으면이 문제를 해결할 방법이 없다고 생각합니다. 참조하십시오 : http://stackoverflow.com/questions/4446620/returning-strings-from-dll-functions – Maxpm

+0

당신이 알아야 할 몇 가지 사항이 있지만 내 코드를 약간 변경 한 후에이 코드로 컴파일 할 수있었습니다. 방법. 그러나 내부 STL 객체가없는 예제에서 개념이 작동하면 문제가 전혀 보이지 않는 간단한 '재귀 배치'에서 충돌이 발생하기 시작합니다. –

+0

@Marcel 왜 다른 포장 옵션과 호환되는 배열을 고려하십니까? 보통 그들은 – user396672

답변

1

? 두 개의 다른 컴파일러와 두 개의 다른 STL 구현을 사용하여 두 개의 프로젝트를 빌드하고 있습니까? 디버그 버전과 릴리스 버전을 혼합 할 때 일반적으로 문제는 두 개의 다른 힙을 가짐으로써 발생합니다. 그런 다음 한 모듈에 할당 된 메모리를 다른 모듈에서 해제하려고하면 오류가 발생합니다. 이것이 맞다면 다른 접근법을 시도 할 수 있습니다. 둘 다 동일한 힙을 사용하십시오.

두 프로젝트를 모두 제어 할 수 있다면 DLL에서 할당 자 (일치하는 할당 취소 자)를 내보내고 EXE에서 사용할 수 있습니다. 이렇게하면 메모리 관리가 단일 힙에서 수행되고 빌드 유형이 중요하지 않습니다. 당신은 operator new, 벡터 /리스트 할당 자 등에서 사용할 수 있습니다.

이것은 아마도 패킹 문제 (패킹 설정을 변경합니까? ...)를 해결하지는 못하지만, 하나 이상의 힙을 사용할 때 원하는 것입니다 .

+0

예, STL에는 두 가지 버전이 필요합니다. 메모리 할당을 처리하는 방법을 찾았 기 때문에 두 개의 힙을 사용한다는 사실에 대해 걱정하지 마십시오. 포장 설정이란 정확히 무엇을 의미합니까? Debug와 Release 같은 컴파일러 설정 차이점 때문에 컴파일이 어려워졌습니다. –

+0

@Marcel Bonzelet [pragma pack] (http://msdn.microsoft.com/en-us/library/2e70t5y1 (v = VS.100) .aspx)을 사용하거나 [/Zp](http://msdn.microsoft.com/en-us/library/xh3e3fd0(v=VS.100).aspx) 스위치. 그들이 동일하다는 것을 확인하십시오 - 당신이 무엇을하는지 모를 경우, (동일한) 디폴트를 갖지 않을 이유가 없습니다. – eran

+0

두 프로젝트에서 기본값을 사용합니다. –