0

以下问题:我想构建一个函数,它返回一个指向来自抽象类的派生对象的指针。我认为,当函数离开时,内存被释放,因为我得到一个分配错误。但是我不能把对象还给我,因为这个类是抽象的。在我决定的函数中,对象将具有哪个派生类。我该如何解决这个问题?任何的想法?

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

2 回答 2

2

您正在返回具有自动存储功能的变量的地址。当函数返回时,该对象被销毁。解决方案是在堆上分配对象。我建议为此目的使用智能指针(unique_ptrshared_ptr与 结合使用)并返回智能指针。make_shared<>()

std::shared_ptr<QgsSymbolV2> QGISFunc::ReadClassSymbolsXML(
    QString FeatureType, 
    QXmlStreamReader &reader
    )
{
    try
    {
        ...
        std::shared_ptr<QgsSymbolV2> spObj = make_shared<QgsMarkerSymbolV2>();
        ...
        return spObj;
    }
    ...
}
于 2013-01-17T19:40:25.427 回答
1

您的问题与抽象类无关。您在堆栈上创建一个对象,然后返回其地址。但是,该地址在函数返回后将不再有效。如果你真的想返回一个指针并将所有权委托给调用者,为什么不在堆上创建它new呢?稍后当您完成该对象时不要忘记delete它,或者像@AndyProwl 建议的那样考虑智能指针。

于 2013-01-17T19:44:35.730 回答