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