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