2011-05-10 6 views
5

Tôi có ứng dụng Visual Studio 2008 C++ cho ARMV4I Windows Mobile 6, nơi tôi đang sử dụng boost::shared_ptr<> để quản lý một đối tượng khá lớn (4KB). Rất tiếc, boost::make_shared<> gây ra ngoại lệ Vi phạm Truy cập.boost :: make_shared gây ra vi phạm truy cập

Mã của tôi:

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; 
} 

Ngoại lệ callstack:

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++ 

Vị trí của các ngoại lệ (tăng \ smart_ptr \ make_shared.hpp):

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

    /* snip! */ 

Vấn đề này không không xảy ra khi biên dịch cho Windows x86. Vấn đề này cũng không xảy ra khi sử dụng shared_ptr như thế này:

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

Ai có thể giải thích những gì đang diễn ra và tại sao điều này chỉ vi phạm trên ARMV4I Windows Mobile 6?

Cảm ơn, PaulH

+0

Phiên bản Boost nào? – ildjarn

+0

@ildjarn - 1.45.0 với STLPort 5.2.1 – PaulH

+0

Điều này có vẻ như đó có thể là lỗi cụ thể về đẩy/lỗi thông minh của nền tảng; có lẽ vì một số loại biến chứng của việc phân bổ một cấu trúc lớn trên ARM. Tôi muốn đề nghị đăng bài này vào danh sách gửi thư. – James

Trả lời

2

Hóa ra đây là sự cố tràn ngăn xếp. Điều này đã được báo cáo trong ticket #4256. Nâng cấp lên các mẹo sẽ sửa lỗi, vì vậy nó sẽ có sẵn trong bản cập nhật Boost tiếp theo.

Nhờ Peter Dimov in the Boost Users ML.

4

Có lẽ đó là một vấn đề liên kết. Tôi không biết chi tiết về việc triển khai, nhưng make_shared<>() cố gắng phân bổ đối tượng shared_ptr<> và đối tượng được chỉ định trong một phân bổ duy nhất. Có lẽ điều này làm cho một trong hai đối tượng kết thúc tại một địa chỉ không được căn chỉnh như trước.

Điều này sẽ giải thích lý do tại sao nó chỉ bị treo trên ARM: Cấu trúc đó có yêu cầu chặt chẽ hơn so với phần cứng PC bình thường. Nếu một int hoặc một con trỏ kết thúc trên một địa chỉ "lạ", chương trình của bạn sẽ sụp đổ trên ARM trong khi PC của bạn vui vẻ truy cập dữ liệu.