[英]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.