指向派生类对象的指针

时间:2013-01-17 10:09:35

标签: qgis c++

以下问题: 我想构建一个函数,它从抽象类返回一个指向派生对象的指针。我认为,当函数被遗留时,内存被释放,因为我得到了一个alloc-error。但是我无法回复对象,因为这个类是抽象的。在我决定的函数中,对象将具有哪个派生类。我该如何解决这个问题? 有什么想法吗?

QgsSymbolV2* QGISFunc::ReadClassSymbolsXML(QString FeatureType, QXmlStreamReader &reader)
    {
        QgsMarkerSymbolV2* p_mlmSymbol=0;
        try
        {
            QgsLineSymbolV2 mllSymbol;
            QgsFillSymbolV2 mlfSymbol;
            QgsMarkerSymbolV2 mlmSymbol;
...
return &mlmSymbol; // alloc error

2 个答案:

答案 0 :(得分:2)

您正在使用自动存储返回变量的地址。当函数返回时,该对象被销毁。解决方案是在堆上分配对象。我建议为此目的使用智能指针(unique_ptrshared_ptrmake_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建议的那样。