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
부스트 버전은 무엇입니까? – ildjarn
@ildjarn - 1.45.0 with STLPort 5.2.1 – PaulH
이것은 플랫폼 특정 부스트/스마트 포인터 버그 일 수 있습니다; 아마 ARM에서 큰 구조를 할당하는 것과 같은 일종의 복잡성 때문일 것입니다. 이 메일 링리스트에 게시하는 것이 좋습니다. – James