gpt4 book ai didi

c++ - boost::make_shared 导致访问冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:44 27 4
gpt4 key购买 nike

我有一个用于 ARMV4I Windows Mobile 6 的 Visual Studio 2008 C++ 应用程序,我正在使用 boost::shared_ptr<>管理一个相当大的对象 (4KB)。不幸的是,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++

异常的位置(boost\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 Windows Mobile 6 上出现问题?

谢谢,保罗H

最佳答案

可能是对齐问题。我不知道实现的细节,但是make_shared<>()尝试分配 shared_ptr<>对象和指向的对象在一次分配中。这可能会导致两个对象之一的地址未按应有的方式对齐。

这可以解释为什么它只在 ARM 上崩溃:该架构比普通 PC 硬件具有更严格的对齐要求。如果 int 或指针以“奇怪”地址结束,您的程序将在 ARM 上崩溃,而您的 PC 可以愉快地访问数据。

关于c++ - boost::make_shared 导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5955682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com