繁体   English   中英

x86和ARM上的共享指针

[英]Shared pointer on x86 and ARM

在共享库(.so)中,我为类对象定义了一个std :: shared_ptr,该对象跨越库边界与主例程(即Qt5.4项目)一起返回给调用者。 该指针在if语句中使用。 由于布尔操作是共享指针的最后所有者,因此在完成此操作后将其删除并调用析构函数。

.so文件(一个Autotools项目):

#define STD_SHARED_PTR std::shared_ptr
#define STD_WEAK_PTR std::weak_ptr

typedef STD_SHARED_PTR<RenderingControl> RDCH;
typedef STD_WEAK_PTR<RenderingControl> WEAK;

class MediaRenderer {
    public:
        RDCH rdc();
}

class RenderingControl {
    public:
        RenderingControl();
        virtual ~RenderingControl();
}

RenderingControl::RenderingControl() {
    ...
}

RendeneringControl::~RenderingControl() {
    cerr << "Destructor called" << endl;
}

RDCH MediaRenderer::rdc() {

    RDCH rdcl = RDCH(new RenderingControl());
    long foo = rdcl.use_count();

    WEAK rdc = rdcl; 
    return rdcl;
}

.cpp(一个Qt5.4项目):

typedef STD_SHARED_PTR<RenderingControl> MRDH;

MRDH renderer = MRDH(new MediaRenderer());

if (renderer->rdc()) {
    ...
    return;
}

在使用Qt4.8或Qt5.4编译的x86机器上,一切正常。 完成if语句后将调用析构函数。 使用Qt5.4为ARM(Raspberry Pi 2)交叉编译,但是不调用析构函数。 如果我另外添加use_count()进行调试,则在x86的.so和.cpp文件中都将产生1,而对于ARM的.so和.cpp中将产生1。

如果我使用Qt4.8在ARM上进行编译,那么在ARM上也一切正常。 但是,为什么它不能在使用Qt5.4的ARM上运行?

谢谢!

显然,原因是我在同一系统上使用不同版本的libstdc ++来编译autotools项目和Qt项目。 但是,即使我通过将库转换为Qt项目(确保在两个部件上使用相同的libstdc ++)解决了问题,我也不明白为什么同一台计算机上存在不同的版本? 这是Qt的特定功能吗? Mayby,任何人都可以解释...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM