我有一个代码片段,如下所示。
我认为这是返回指针的一种不好的方法,因为我正在返回本地引用。什么是优良作法,返回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;
}
}
最佳答案
除非有正当的理由,否则最好返回一个对象,而不是分配给堆上的指针。
返回对象的优点
性能。从堆分配内存需要更多时间。
更少的编程错误。您必须处理内存管理问题-确保返回的指针有效,确保已释放的内存已释放,确保没有在背后释放对象,而使指针悬空,等等。
什么时候返回指针有意义?
您的对象的尺寸很大。在内存使用和性能方面,传递它们并保留多个副本将非常昂贵。
您拥有一个完善的系统来管理对象的生存时间-对象的分配位置,对象在生存期间对其进行管理以及人员对它们的分配进行管理。
您有一个应用程序,其中的对象具有很深的层次结构,许多函数将其用作基类的输入指针,但要依靠对象的多态行为才能正常工作。
我怀疑还有很多其他原因支持这两种用例。我只列出了一些在我脑海中浮出水面的东西。
关于c++ - 避免返回本地引用(返回对本地变量的引用-警告),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22586537/