以下问题: 我想构建一个函数,它从抽象类返回一个指向派生对象的指针。我认为,当函数被遗留时,内存被释放,因为我得到了一个alloc-error。但是我无法回复对象,因为这个类是抽象的。在我决定的函数中,对象将具有哪个派生类。我该如何解决这个问题? 有什么想法吗?
QgsSymbolV2* QGISFunc::ReadClassSymbolsXML(QString FeatureType, QXmlStreamReader &reader)
{
QgsMarkerSymbolV2* p_mlmSymbol=0;
try
{
QgsLineSymbolV2 mllSymbol;
QgsFillSymbolV2 mlfSymbol;
QgsMarkerSymbolV2 mlmSymbol;
...
return &mlmSymbol; // alloc error
答案 0 :(得分:2)
您正在使用自动存储返回变量的地址。当函数返回时,该对象被销毁。解决方案是在堆上分配对象。我建议为此目的使用智能指针(unique_ptr
或shared_ptr
与make_shared<>()
组合)并返回智能指针。
std::shared_ptr<QgsSymbolV2> QGISFunc::ReadClassSymbolsXML(
QString FeatureType,
QXmlStreamReader &reader
)
{
try
{
...
std::shared_ptr<QgsSymbolV2> spObj = make_shared<QgsMarkerSymbolV2>();
...
return spObj;
}
...
}
答案 1 :(得分:1)
你的问题与抽象的类无关。您在堆栈上创建一个对象,然后返回其地址。该函数返回后,该地址将不再有效。如果您确实想要返回指针并将所有权委托给调用者,为什么不在new
的堆上创建它?不要忘记delete
,尽管稍后当你完成该对象时,或者考虑智能指针,如@AndyProwl建议的那样。