避免在本地范围内动态分配

时间:2012-04-17 09:01:58

标签: c++ pointers dynamic reference

我的代码中有一个代码段:

const std::pair<Info, const ElementHandler&>& handle () const {
                    FileHandler fileHandler = FileHandler();
                    std::pair<Info, const ElementHandler&> result = std::pair<Info, const FileHandler&> ( info, fileHandler );
                    return result;
                }

我有以下编译错误:

error: cannot declare field ‘std::pair<Synchronizer::Info, Synchronizer::ElementHandler>::second’ to be of abstract type ‘Synchronizer::ElementHandler’

我如何编写代码来保存这个想法?是可能的,还是我需要使用指针和动态分配?

3 个答案:

答案 0 :(得分:1)

  1. fileHandlernew分配,或者可能作为某种shared_ptr。函数退出后,对fileHandler的当前引用将无效。
  2. 按值返回result,而不是按引用返回。

答案 1 :(得分:1)

无论如何,你需要使用动态分配。

在您的函数中,您正在创建一个局部变量'fileHandler'并返回对它的引用。一旦函数返回,'fileHandler'就会超出范围并被破坏,导致引用无效。

我认为你可以使用智能指针(unique_ptr,shared_ptr,...)很好地解决这个问题。您的智能指针可以指向ElementHandler,如果ElementHandler有一个虚拟析构函数,如果该对被删除或超出范围,它将被正确销毁。

答案 2 :(得分:1)

  

“避免在本地范围内进行动态分配”。

如果这是您破损代码背后的驱动需求,那么我不会通过告诉您如何修复它来做您不想要的事情来跟踪趋势;-)。相反,你必须正确考虑其含义。您必须拥有一个变量,其范围与调用者的需求相匹配。必须排除本地自动变量 - 它们在函数返回时被销毁。所以,你可以:

  • 使用函数范围的static变量或全局变量,但每次调用函数时都是相同的变量,并且可能存在线程安全问题(您的编译器可能支持某些特定于线程的关键字) ,POSIX具有支持特定于线程的数据的功能 - 但每个线程的1个对象可能仍然限制太多)
  • 为许多变量创建一些带空间的缓冲区,并控制它们的生命周期并以适合客户端代码的某种方式重用(例如,通过数组轮换,知道客户端将按照它们返回的顺序释放它们,从不同时需要多于数组大小)
  • 让客户端代码担心生命周期(他们可能比您更了解)并提供您要加载结果的变量(例如bool load_my_x(X&);
    • 这里的问题是调用者需要为FileHandler分配空间而不仅仅是ElementHandler