簡體   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