x86和ARM上的共享指针

时间:2015-08-04 08:20:02

标签: c++ qt c++11 arm

在共享库(.so)中,我将std :: shared_ptr定义为一个类对象,该类对象通过库边界返回给作为Qt5.4项目的主例程的调用者。那里的指针用在if语句中。由于bool操作是共享指针的最后一个所有者,因此在完成此操作后将删除它,并且会调用析构函数。

.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,但在.so中为1,在ARM的.cpp中为0。

如果我使用Qt4.8在ARM上编译,那么ARM上的一切都很好。但是为什么它不适用于使用Qt5.4的ARM?

谢谢!

1 个答案:

答案 0 :(得分:0)

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