2011-05-10 3 views
5

ARMv4I Windows Mobile 6 용 Visual Studio 2008 C++ 응용 프로그램을 가지고 있는데 여기서는 boost::shared_ptr<>을 사용하여 매우 큰 개체 (4KB)를 관리하고 있습니다. 아쉽게도 boost::make_shared<>은 액세스 위반 예외를 발생시킵니다.boost :: make_shared가 액세스 위반을 야기합니다.

내 코드 :

struct Foo 
{ 
    char a[ 4 * 1024 - 1 ]; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    boost::shared_ptr<Foo> f = boost::make_shared<Foo>(); // Access Violation 
    return 0; 
} 

예외 호출 스택 :

test.exe!boost::detail::sp_ms_deleter<o>::sp_ms_deleter<o>(void) Line: 60, Byte Offsets: 0x18 C++ 
test.exe!boost::make_shared<o>(void) Line: 106, Byte Offsets: 0x5c C++ 
test.exe!wmain(int argc = 1, wchar_t** argv = 0x01b40060) Line: 81, Byte Offsets: 0x18 C++ 
test.exe!mainWCRTStartup(HINSTANCE__* hInstance = 0x00000003, HINSTANCE__* hInstancePrev = 0x00000000, unsigned short* lpszCmdLine = 0x00000003, int nCmdShow = 0) Line: 188, Byte Offsets: 0x94 C++ 

예외의 위치 (부스트 \ smart_ptr \ make_shared.hpp) :이 문제는 않습니다

template< class T > class sp_ms_deleter 
{ 
    /* snip! */   
public: 
    sp_ms_deleter(): initialized_(false) 
    { // line: 60 this = NULL 
    } 

    /* snip! */ 

x86 Windows 용으로 컴파일 할 때 발생하지 않습니다. 이 문제는이 같은 shared_ptr을 사용하는 경우 발생하지 않습니다

boost::shared_ptr<Foo> f1 = boost::shared_ptr<Foo>(new Foo); 

아무도 무슨 일이 일어나고 있는지 설명 할 수 및이 ARMV4I 윈도우 모바일 6 만 파괴되는 이유는 무엇입니까?

덕분에, PaulH

+0

부스트 버전은 무엇입니까? – ildjarn

+0

@ildjarn - 1.45.0 with STLPort 5.2.1 – PaulH

+0

이것은 플랫폼 특정 부스트/스마트 포인터 버그 일 수 있습니다; 아마 ARM에서 큰 구조를 할당하는 것과 같은 일종의 복잡성 때문일 것입니다. 이 메일 링리스트에 게시하는 것이 좋습니다. – James

답변

2

스택 오버플로 문제가 있습니다. 이것은 이미 ticket #4256에보고되었습니다. 팁으로 업그레이드하면 문제가 해결되므로 다음 Boost 업데이트에서 사용할 수 있습니다.

덕분에 Peter Dimov in the Boost Users ML.

4

아마 그것은 정렬 문제입니다. 구현의 세부 사항을 알지 못하지만 make_shared<>()shared_ptr<> 개체와 지정 대상 개체를 하나의 단일 할당으로 할당하려고합니다. 아마도 이것은 두 객체 중 하나가 정렬되지 않은 주소로 끝나기 때문입니다.

이것은 ARM에서만 충돌하는 이유를 설명합니다.이 아키텍처는 일반적인 PC 하드웨어보다 엄격한 정렬 요구 사항을 가지고 있습니다. int 또는 포인터가 "이상한"주소로 끝나면 PC가 데이터에 행복하게 액세스하는 동안 ARM에서 프로그램이 중단됩니다.

관련 문제