2011-05-10 62 views
5

我有一個Visual Studio 2008 C++應用程序ARMV4I Windows Mobile 6,我使用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時不會發生。

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

任何人能解釋這是怎麼回事,爲什麼這是ARMV4I上的Windows Mobile 6只破:也沒有使用這樣的shared_ptr的時候會出現這個問題?

感謝, PaulH

+0

什麼版本的Boost? – ildjarn 2011-05-10 19:56:57

+0

@ildjarn - 1.45.0與STLPort 5.2.1 – PaulH 2011-05-10 19:57:33

+0

這看起來像它可能是一個特定平臺升壓/智能指針錯誤;可能是因爲在ARM上分配大型結構的某種複雜情況。我建議發佈這個郵件列表。 – James 2011-05-10 20:00:34

回答

4

也許這是一個定位的問題。我不知道實現的細節,但make_shared<>()嘗試在一次分配中分配shared_ptr<>對象和指向的對象。可能這會導致兩個對象中的一個最終落入未對齊的地址。

這將解釋爲什麼它只在ARM上崩潰:該架構比通常的PC硬件有更嚴格的對齊要求。如果一個int或一個指針以「陌生」地址結束,你的程序將在ARM上崩潰,而你的PC確實很高興地訪問這些數據。