2015-10-26 76 views
1

我已經編寫了一個小樣本應用程序代碼,如下所示。訪問QSharedPointer對象時出現分段錯誤

#include <QCoreApplication> 
#include <QSharedPointer> 
#include <QDebug> 

class INav 
{ 
public: 
    virtual int getdata() = 0; 
    virtual void setdata(int a) = 0; 
}; 

class Nav : public INav 
{ 
    int i; 
public: 
    Nav(int a) : i(a) {} 

    int getdata() { return i;} 
    void setdata(int a) { i = a; } 
}; 

class CMain 
{ 
    Nav* nav; 

public: 
    CMain(Nav* n) : nav(n) {} 
    QSharedPointer<INav> getINav() 
    { 
     QSharedPointer<Nav> n(nav); 
     return n.staticCast<INav>(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QSharedPointer<CMain> m(new CMain(new Nav(1))); 

    int i = 0; 
    while (++i != 3) 
    { 
     QSharedPointer<INav> nav = m->getINav(); 
     qDebug() << nav.data()->getdata(); 
    } 

    return a.exec(); 
} 

當我第二次打印調試消息時,它顯示了分段錯誤和應用程序崩潰。 根據QSharedPointer的文檔,它可能在訪問元素後第一次刪除指針。

我想要QSharedPointer nav = m-> getINav();要在while循環 本身,因爲這是一種虛擬應用程序,對於我的真實場景 問題。

我不知道如何使此作品,任何幫助將不勝感激。提前致謝。

+0

當'QSharedPointer nav'超出範圍時,您的假設是正確的,指針正在被刪除。爲什麼不把指針存儲在CMain中作爲共享指針? – NathanOliver

+0

@ NathanOliver它傷心:)謝謝, – Swapnil

回答

4

您不能通過相同的指針實例化多個對象shared_ptrQSharedPointer)。在這種情況下,第一個銷燬的共享指針也會銷燬擁有的對象。

只有一個共享指針應該由真實指針初始化。然後複製那個指針,一個新的共享指針應該被另一個擁有該對象的共享指針初始化。

這裏類CMain應該保留QSharedPointer<Nav>而不是純指針。吸氣劑應該給出QSharedPointer的副本。在這種情況下,物品Nav只有在最後所有者QSharedPointer將被銷燬時纔會被銷燬。