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:)谢谢,