2011-05-10 111 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确实很高兴地访问这些数据。