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
Phiên bản Boost nào? – ildjarn
@ildjarn - 1.45.0 với STLPort 5.2.1 – PaulH
Đ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