【问题标题】:Returning a pointer to an object from a list从列表中返回指向对象的指针
【发布时间】:2012-01-05 22:31:27
【问题描述】:

我在 FutureEvent 类中有一个对象列表,我希望能够在其中执行类似 futureEvents.getNextEvent() 的操作。这是我目前所拥有的,但是由于 New 调用,我认为这是我的主要内存泄漏的原因。任何帮助将不胜感激。我还能如何将指针返回到下一个事件。谢谢

EVENT* FutureEvent::getNextEvent()
{
EVENT* nextEvent = new EVENT;
*nextEvent = futureEvents.front();
futureEvents.pop_front();
return nextEvent;
}

【问题讨论】:

    标签: c++ list pointers reference


    【解决方案1】:

    如果你没有在任何地方delete这个函数的结果,这肯定是内存泄漏的原因。

    可能的解决方案包括:

    1. 按价值返回

      使用这种方法,您甚至不需要使用动态分配(即new)。您只使用自动对象,因此无需清理:它们使用的内存会自动释放,并且会自动调用任何析构函数。

      EVENT FutureEvent::getNextEvent() {
          EVENT nextEvent = futureEvents.front();
          futureEvents.pop_front();
          return nextEvent;
      }
      
    2. 使用智能指针

      这种方法仍然使用动态分配,但它委托给一个可以自动处理清理的类。

      std::unique_ptr<EVENT> FutureEvent::getNextEvent() {
          std::unique_ptr<EVENT> nextEvent(new EVENT(futureEvents.front()));
          futureEvents.pop_front();
          return nextEvent;
      }
      

      如果您的编译器不支持 std::unique_ptr,您可以使用 Boost 中的智能指针之一,例如 boost::shared_ptr

    【讨论】:

    • 您还可以在方法参数中包含一个 EVENT *,这有助于组织代码。调用该方法的人需要提供数据结构来存储结果,这意味着他分配内存并负责释放它。
    • 非常感谢通过价值解决了我的问题。非常感谢
    • 根据cplusplus.com/reference/stl/list/pop_front,调用pop_front 将调用被删除元素的析构函数。在此之后继续访问对象可能会导致未定义的行为。
    • @dtyler:首先,cplusplus.com 是一个不好的参考,因为它在某些地方包含事实错误和不好的例子。但需要注意的重要一点是,在所有三个 sn-ps(原始的和我发布的两个)中,返回的对象与 futureEvents 中的对象不同。它是一个副本(副本是使用原始赋值生成的,在我的示例中使用复制构造函数)。
    • 既然您明确提到您的解决方案 1 需要一个复制构造函数:OP 的代码也是如此(您的第二个示例)。因此,提及具有误导性。
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多