2011-05-10 14 views
5

Tengo una aplicación Visual Studio 2008 C++ para ARMV4I Windows Mobile 6 donde estoy usando boost::shared_ptr<> para administrar un objeto bastante grande (4 KB). Desafortunadamente, boost::make_shared<> provoca una excepción de Infracción de acceso.boost :: make_shared provoca infracción de acceso

Mi código:

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

La pila de llamadas excepción:

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

La ubicación de la excepción (impulso \ smart_ptr \ make_shared.hpp):

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

    /* snip! */ 

Este problema hace no ocurre al compilar para x86 Windows. Este problema tampoco se produce cuando se utiliza el shared_ptr así:

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

¿Alguien puede explicar lo que está pasando y por qué esto está rompiendo sólo en ARMV4I Windows Mobile 6?

Gracias, PaulH

+0

¿Qué versión de Boost? – ildjarn

+0

@ildjarn - 1.45.0 con STLPort 5.2.1 – PaulH

+0

Parece que podría tratarse de un error de boost/smart puninters específico de la plataforma; presumiblemente debido a algún tipo de complicación de asignar una estructura grande en ARM. Sugeriría publicar esto en la lista de correo. – James

Respuesta

2

Resulta que se trata de un problema de desbordamiento de la pila. Esto ya se informó en ticket #4256. La actualización a las sugerencias lo corrige, por lo que debería estar disponible en la próxima actualización de Boost.

Gracias a Peter Dimov in the Boost Users ML.

4

Probablemente es un problema de alineación. No sé los detalles de la implementación, pero make_shared<>() intenta asignar el objeto shared_ptr<> y el objeto apuntado en una única asignación. Probablemente esto causa que uno de los dos objetos termine en una dirección que no está alineada como debería ser.

Esto explicaría por qué solo se bloquea en ARM: esa arquitectura tiene requisitos de alineación más estrictos que el hardware de PC normal. Si un int o un puntero termina en una dirección "extraña", su programa se bloqueará en ARM mientras su PC acceda felizmente a los datos.

Cuestiones relacionadas