boost:: make shared вызывает нарушение доступа
У меня есть приложение Visual Studio 2008 C++ для ARMV4I Windows Mobile 6, где я использую boost::shared_ptr<>
для управления довольно большим объектом (4 КБ). К сожалению, 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;
}
Исключение 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++
Расположение исключения (boostsmart_ptrmake_shared.ГЭС):
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 Windows Mobile 6?
Спасибо, Paul
2 ответа:
Вероятно, это проблема выравнивания. Я не знаю подробностей реализации, но
Это объясняет, почему он падает только на ARM: эта архитектура имеет более строгие требования к выравниванию, чем обычное оборудование ПК. Если int или указатель заканчивается на" странном " адресе, ваша программа произойдет сбой на ARM, в то время как ваш компьютер счастливо получить доступ к данным.make_shared<>()
пытается выделить объектshared_ptr<>
и объект, на который указывают, в одном выделении. Вероятно, это приводит к тому, что один из двух объектов оказывается по адресу, который не выровнен, как это должно быть.
Оказывается, это проблема переполнения стека. Об этом уже сообщалось в билете № 4256. Обновление до подсказок исправляет его,поэтому он должен быть доступен в следующем обновлении Boost.
Спасибо Петру Димову в Boost Users ML .