Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问QSharedPointer对象时出现分段错误_C++_Qt_Polymorphism_Qsharedpointer - Fatal编程技术网

C++ 访问QSharedPointer对象时出现分段错误

C++ 访问QSharedPointer对象时出现分段错误,c++,qt,polymorphism,qsharedpointer,C++,Qt,Polymorphism,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:

我编写了一个小样本应用程序代码,如下所示

#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();
}
#包括
#包括
#包括
INav类
{
公众:
虚拟int getdata()=0;
虚空setdata(inta)=0;
};
类别导航:公共INav
{
int i;
公众:
导航(INTA):i(a){}
int getdata(){return i;}
void setdata(inta){i=a;}
};
类CMain
{
导航*导航;
公众:
CMain(Nav*n):Nav(n){}
QSharedPointer getINav()
{
Q共享指针n(导航);
返回n.staticCast();
}
};
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
Q共享指针m(新CMain(新Nav(1));
int i=0;
而(++i!=3)
{
QSharedPointer nav=m->getINav();
qDebug()获取数据();
}
返回a.exec();
}
当我第二次打印调试消息时,它会显示分段错误和应用程序崩溃。 根据QSharedPointer的文档,它可能是在访问元素后第一次删除指针

我想要QSharedPointer nav=m->getINav();在while循环中 这本身就是我真实场景中的一种虚拟应用程序 问题


我不知道如何使这项工作,任何帮助将不胜感激。提前谢谢

不能用同一个指针实例化多个
shared_ptr
QSharedPointer
)对象。在这种情况下,第一个被销毁的共享指针也会销毁拥有的对象

只有一个共享指针应该由实指针初始化。然后,要复制该指针,新的共享指针应该由拥有该对象的另一个共享指针初始化


这里类
CMain
应该保留
QSharedPointer
,而不是纯指针。getter应该提供该
QSharedPointer
的副本。在这种情况下,对象
Nav
只有在其最后所有者
QSharedPointer
将被销毁时才会被销毁。

您不能通过同一指针实例化
共享的
QSharedPointer
)的多个对象。在这种情况下,第一个被销毁的共享指针也会销毁拥有的对象

只有一个共享指针应该由实指针初始化。然后,要复制该指针,新的共享指针应该由拥有该对象的另一个共享指针初始化


这里类
CMain
应该保留
QSharedPointer
,而不是纯指针。getter应该提供该
QSharedPointer
的副本。在这种情况下,对象
Nav
只有在最后一个所有者
QSharedPointer
将被销毁时才会被销毁。

您的假设是正确的,即当
QSharedPointer Nav
超出范围时,您身上的指针将被删除。为什么不将指针作为共享指针存储在
CMain
中?@NathanOliver It wored:)谢谢,您的假设是正确的,即当
QSharedPointer nav
超出范围时,正在删除您身上的指针。为什么不将指针作为共享指针存储在
CMain
中?@NathanOliver It wored:)谢谢,