避免返回本地引用(引用返回的局部变量 - 警告)

时间:2014-03-23 03:00:01

标签: c++ pointers reference

我有一个代码片段,如下所示。 我认为这是一个返回指针的坏方法,因为我返回一个本地引用。什么是好的做法,返回DbTable副本或指针DbTable *

  DbTable * Catalog::addTable(PartitionScheme  &partScheme, BoundBases &bounds, std::vector<int> &colsPartitioned, const size_t defaultMaxFragmentSize, const TupleDesc &tupleDesc , std::string tableName){

           // some code ...

                    DbTable * dbTable = new DbTable(tableId, basePath, defaultMaxFragmentSize, tupleDesc, partScheme, bounds, colsPartitioned); 
                    cout << "adding dbTable with name: " << tableName << " and table Id " << tableId << endl;
           // some code ...       
                    return dbTable;
            }

    }

2 个答案:

答案 0 :(得分:1)

除非有正当理由不这样做,否则更喜欢在堆上分配的指针上返回一个对象。

返回对象的优点

  1. 性能。从堆中分配内存需要更多时间。
  2. 减少编程错误。你必须处理内存管理问题 - 确保返回的指针是有效的,确保分配的内存被释放,确保对象没有在你的背后释放,留下你的悬挂指针等。
  3. 什么时候返回指针才有意义?

    1. 对象的大小很大。在内存使用和性能方面,传递它们并保留多份副本将是昂贵的。
    2. 您有一个全面的系统来管理对象的生命时间 - 分配对象,在活着时管理对象,以及管理对象的释放。
    3. 你有一个应用程序,其中有一个深层次的对象,许多函数作为基类的输入指针,但依赖于对象的多态行为才能正常工作。
    4. 我怀疑还有很多其他原因支持两种用例。我刚刚列出了一些在脑海中跳出来的东西。

答案 1 :(得分:-1)

当从函数返回指针时,如果指针指向本地分配的内存(不在堆上),则一旦函数结束,它将被释放。因此,在这种情况下,返回指针并不是一个好习惯。

在您的情况下,由于内存是在堆上分配的,因此您可以返回指针。